From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id CAC403858414 for ; Thu, 21 Mar 2024 12:07:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CAC403858414 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CAC403858414 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=45.83.234.184 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711022836; cv=none; b=v4xT+A5h22F2mJRgDA5n0zNg+YSDnpq+gyAFCWM3XzrPFqvvCihvqKZRf+6VzjmN7e5SZrz4t7hctCKqf5UG0iSispXnPO4CPGJVNrzS/9E9M5QSK9h6oFpkmPB4gV+W6r9qZzyDFDoAIe3RmnPYNgZt+Au8/PhPTO156qX/nfQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711022836; c=relaxed/simple; bh=wB+JhQVcnFWejrMTv2m1uM7z01S6562OniCa9FPydC0=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=puyYe5nCiuXNWI8erxFnITl+TNb5BLoncYVGaFqlQQw3x1g2FRueY6sqWAUJwEMbZ8BRrP8RPRpXQx739zuPHw9ZUpU5ZmiozISzgMfk8DvLqrp5CiVWYwE8vTiL0Bryj/kYx9rScN0AyP8PH88RDfRFm27sIsLLS6eg+Vpt2bo= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from r6.localdomain (82-217-174-174.cable.dynamic.v4.ziggo.nl [82.217.174.174]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id BDC0F3000472; Thu, 21 Mar 2024 13:07:03 +0100 (CET) Received: by r6.localdomain (Postfix, from userid 1000) id 0D1103404B0; Thu, 21 Mar 2024 13:07:03 +0100 (CET) From: Mark Wielaard To: debugedit@sourceware.org Cc: Allan McRae , Mark Wielaard Subject: [PATCH v2] debugedit: Only write the ELF file when updating strings or build-id Date: Thu, 21 Mar 2024 13:06:03 +0100 Message-ID: <20240321120658.262490-1-mark@klomp.org> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Only open the ELF file read/write and write out the data if we actually did any elf structure update or updating the build-id. * tools/debugedit.c (fdopen_dso): Call elf_begin with ELF_C_READ when not changing dest_dir or build_id, otherwise use ELF_C_RDWR. (main): Call open with O_RDONLY when not changing dest_dir or build_id, otherwise use O_RDWR. Call elf_update with ELF_C_WRITE when rewriting any string, updating any ELF structure or build_id. https://sourceware.org/bugzilla/show_bug.cgi?id=31504 Signed-off-by: Mark Wielaard --- tools/debugedit.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) v2: Only actually call elf_update with ELF_C_WRITE when rewriting any string, updating any ELF or build_id. diff --git a/tools/debugedit.c b/tools/debugedit.c index 7802f9fe03fc..f16eecd89a61 100644 --- a/tools/debugedit.c +++ b/tools/debugedit.c @@ -3261,7 +3261,10 @@ fdopen_dso (int fd, const char *name) DSO *dso = NULL; size_t phnum; - elf = elf_begin (fd, ELF_C_RDWR, NULL); + if (dest_dir == NULL && (!do_build_id || no_recompute_build_id)) + elf = elf_begin (fd, ELF_C_READ, NULL); + else + elf = elf_begin (fd, ELF_C_RDWR, NULL); if (elf == NULL) { error (0, 0, "cannot open ELF file: %s", elf_errmsg (-1)); @@ -3600,7 +3603,10 @@ main (int argc, char *argv[]) if (chmod (file, stat_buf.st_mode | S_IRUSR | S_IWUSR) != 0) error (0, errno, "Failed to chmod input file '%s' to make sure we can read and write", file); - fd = open (file, O_RDWR); + if (dest_dir == NULL && (!do_build_id || no_recompute_build_id)) + fd = open (file, O_RDONLY); + else + fd = open (file, O_RDWR); if (fd < 0) { error (1, errno, "Failed to open input file '%s'", file); @@ -3805,7 +3811,16 @@ main (int argc, char *argv[]) if (do_build_id && build_id != NULL) handle_build_id (dso, build_id, build_id_offset, build_id_size); - if (elf_update (dso->elf, ELF_C_WRITE) < 0) + /* If we have done any string replacement or rewrote any section + data or did a build_id rewrite we need to write out the new ELF + image. */ + if ((need_string_replacement + || need_strp_update + || need_line_strp_update + || need_stmt_update + || dirty_elf + || (build_id && !no_recompute_build_id)) + && elf_update (dso->elf, ELF_C_WRITE) < 0) { error (1, 0, "Failed to write file: %s", elf_errmsg (elf_errno())); } -- 2.44.0