From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from linderud.pw (linderud.dev [163.172.10.146]) by sourceware.org (Postfix) with ESMTPS id C16443858D35 for ; Sun, 6 Nov 2022 17:11:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C16443858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linderud.pw Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linderud.pw Received: from linderud.pw (localhost [127.0.0.1]) by linderud.pw (Postfix) with ESMTP id DAF77C02EA; Sun, 6 Nov 2022 18:10:31 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SOMETLD_ARE_BAD_TLD,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linderud.pw; s=linderud; t=1667754631; bh=VTFvWsHnnd0gT9R8dEHuPIUQiuhlu9LMdcRtMtMllhY=; h=From:To:Cc:Subject:Date; b=d4393qv+HGBo/BNK8ae7Bj0znm4m67HdtP8z4VL1UpOGyNwBVGcLVRWYnXUigCh/P WWl+dbf/iUCl9ieTZfmPX0fbcSGOTb/6CTCZWHauNfolRX5hUIWJDxssNFhb3QAqL0 PmfN0DHP6B9qTBgIJ21vBcWt0NYl8PtzGnUHvX/5vhJEleIgx4RwTlxfBQBZbno4kj uMQMopIZ6cOi+ZNhmbTf2lNfRcqi8Lzyc6IjTIk+8RXSUQTKCBmTty858eQVtoR4IZ MDsIvpTrnLQcUL2oz4/fR3WJQNkFU5qn2GMGmN9X/jh5zt1ZecQXtPVAsMDBf0Fr5e Lnqnf1s1iqQXF7wyVYOEHPs5OXFYdQ3YD5gZqCyFNbTmzECSmLKIosx92cprCCaknp qtPmR2dlc3AFTgQ+0xLLpa/316t0PBTEcoeAqYizDVoTsZ7R8PcSsWIOZShv6SDo1+ yVmInqoMCLV9uQzLRTSBMiHqv7spL6ugJfLsPZU91wJny+PhzCDdIGtcmX++PyVrao zD5KALU5scx2G3VP5azltmIyHwhR7TB933EKWxI6nZOlyZSZ/Z1l8SNesJ+WhAN20m +V/LsZn1D0dnYI8WgRwAr+9CtkPaZ9jkHTfy5EG7eVF9JN3oomgdaYblQfTJ5+0j1D yKQy/6zYRbExWPf7gGk0HIhk= Received: from localhost (host-37-191-241-102.lynet.no [37.191.241.102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: morten) by linderud.pw (Postfix) with ESMTPSA id 9D878C0168; Sun, 6 Nov 2022 18:10:31 +0100 (CET) From: Morten Linderud To: debugedit@sourceware.org Cc: Morten Linderud Subject: [PATCH] debugedit: decompress DWARF sections if found Date: Sun, 6 Nov 2022 18:10:23 +0100 Message-Id: <20221106171023.584216-1-morten@linderud.pw> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: When encountering compressed DWARF section try to decompress them before rewriting. This will not recompress any sections. Introduce --no-decompress-dwarf to skip compressed sections instead of decompressing them. Signed-off-by: Morten Linderud --- tests/debugedit.at | 23 +++++++++++++++++++++++ tools/debugedit.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/tests/debugedit.at b/tests/debugedit.at index 725e68e..84fadaa 100644 --- a/tests/debugedit.at +++ b/tests/debugedit.at @@ -696,3 +696,26 @@ $CC $CFLAGS -gdwarf-5 -o main main.c AT_CHECK([[debugedit -l sources.list main]]) AT_CHECK([[grep -q main.c sources.list]]) AT_CLEANUP + +# === +# source list with compression dwarf-4 +# === +AT_SETUP([debugedit --list-file compessed]) +AT_KEYWORDS([debuginfo] [debugedit]) +echo "int main () { }" > main.c +$CC $CFLAGS -gz=zlib -gdwarf-4 -o main main.c +AT_CHECK([[debugedit -l sources.list main]]) +AT_CHECK([[grep -q main.c sources.list]]) +AT_CLEANUP + + +# === +# no decompress dwarf +# === +AT_SETUP([debugedit --no-decompress-dwarf --list-file compessed]) +AT_KEYWORDS([debuginfo] [debugedit]) +echo "int main () { }" > main.c +$CC $CFLAGS -gz=zlib -gdwarf-4 -o main main.c +AT_CHECK([[debugedit -c -l sources.list main]]) +AT_CHECK([[test `wc -l < sources.list` -eq 0]]) +AT_CLEANUP diff --git a/tools/debugedit.c b/tools/debugedit.c index d82ae5a..9d7e29f 100644 --- a/tools/debugedit.c +++ b/tools/debugedit.c @@ -18,6 +18,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -92,6 +93,7 @@ char *list_file = NULL; int list_file_fd = -1; int do_build_id = 0; int no_recompute_build_id = 0; +int no_decompress_dwarf = 0; char *build_id_seed = NULL; int show_version = 0; @@ -202,6 +204,7 @@ typedef struct struct strings debug_str, debug_line_str; struct debug_lines lines; GElf_Shdr shdr[0]; + GElf_Chdr chdr[0]; } DSO; static void @@ -2608,6 +2611,27 @@ edit_dwarf2 (DSO *dso) } scn = dso->scn[i]; + + // Check for compressed DWARF headers + // does not recompress headers if we encounter them + if (dso->shdr[i].sh_flags & SHF_COMPRESSED) + { + // Found compressed sections, abort rewrite if we don't intend to decompress + if (no_decompress_dwarf) + return 0; + + if (gelf_getchdr(dso->scn[i], &dso->chdr[i]) == NULL) + error (1, 0, "Couldn't get compressed header: %s", + elf_errmsg (-1)); + uint32_t ch_type; + ch_type = dso->chdr[i].ch_type; + if(ch_type != ELFCOMPRESS_ZLIB) + error (1, 0, "Unknown compression method"); + if (elf_compress (scn, 0, 0) == 0) + error (1, 0, "Failed decompression"); + gelf_getshdr (scn, &dso->shdr[i]); + } + data = elf_getdata (scn, NULL); assert (data != NULL && data->d_buf != NULL); assert (elf_getdata (scn, data) == NULL); @@ -3029,13 +3053,14 @@ static struct option optionsTable[] = { "build-id", no_argument, 0, 'i' }, { "build-id-seed", required_argument, 0, 's' }, { "no-recompute-build-id", no_argument, 0, 'n' }, + { "no-decompress-dwarf", no_argument, 0, 'c' }, { "version", no_argument, 0, 'V' }, { "help", no_argument, 0, '?' }, { "usage", no_argument, 0, 'u' }, { NULL, 0, 0, 0 } }; -static const char *optionsChars = "b:d:l:is:nV?u"; +static const char *optionsChars = "b:d:l:is:ncV?u"; static const char *helpText = "Usage: %s [OPTION...] FILE\n" @@ -3049,6 +3074,7 @@ static const char *helpText = " this string as hash seed\n" " -n, --no-recompute-build-id do not recompute build ID note even\n" " when-i or -s are given\n" + " -c, --no-decompress-dwarf do not decompress DWARF headers\n" "\n" "Help options:\n" " -?, --help Show this help message\n" @@ -3059,7 +3085,8 @@ static const char *usageText = "Usage: %s [-in?] [-b|--base-dir STRING] [-d|--dest-dir STRING]\n" " [-l|--list-file STRING] [-i|--build-id] \n" " [-s|--build-id-seed STRING]\n" - " [-n|--no-recompute-build-id] [-?|--help] [-u|--usage]\n" + " [-n|--no-recompute-build-id]\n" + " [-c|--no-decompress-dwarf] [-?|--help] [-u|--usage]\n" " [-V|--version] FILE\n"; static void @@ -3362,6 +3389,10 @@ main (int argc, char *argv[]) no_recompute_build_id = 1; break; + case 'c': + no_decompress_dwarf = 1; + break; + case 'V': show_version = 1; break; -- 2.38.1