[Added Nick in CC.]
> Hi Guillermo, > > On Mon, May 30, 2022 at 09:26:19PM -0500, Guillermo E. Martinez via > Elfutils-devel wrote: >> Hello elfutils team, >> >> This patch is meant to avoid remove the CTF section in >> stripped files. Please let me know your thoughts. >> >> CTF debug format was designed to be present in stripped files, so >> this section should not be removed, so a new --remove-ctf option >> is added to indicate explicitly that .ctf section will be stripped >> out from binary file. > > First, very nice patch. My only real concern with it is that it should > describe how the testfile-ctf.bz2 is generated. We don't want really > random test binaries in the testsuite. There should be at least some > method to regenerate them, even if we don't automate that. See > e.g. tests/run-readelf-n.sh which also uses binary test files, but has > a little description on how each of them was generated. > > I am CCing Nick Clifton who works on binutils and annobin to check how > binutils strip handles this. And because we were recently discussing > putting some annobin data in a special section and how to indicate > that this section should be explicitly kept or removed. It would be > great if we could come to some kind of standard way of marking such > sections so we don't need special arguments for each such section or > at least have a more generic SECTION_STRIP_P macro. AFAIK the binutils `strip' does not strip .ctf sections. > Note, that this might not be possible, these sections might be to > different/specific that generalizing over them is impossible. But it > would be good to at least try and discuss it. If only so that elfutils > eu-strip and binutils strip agree on how to handle/coordinate on such > special sections. What about using an OS-specific section flag in elf.h, something like: #define SHF_GNU_PERSISTENT 0x0ff00001 /* Section must not be stripped. */ > > Cheers, > > Mark > >> Signed-off-by: Guillermo E. Martinez <guillermo.e.marti...@oracle.com> >> --- >> ChangeLog | 23 ++++ >> libebl/eblsectionstripp.c | 4 +- >> libebl/libebl.h | 2 +- >> libelf/elf-knowledge.h | 7 +- >> libelf/elf32_checksum.c | 2 +- >> src/elfcmp.c | 4 +- >> src/strip.c | 71 ++++++++-- >> tests/Makefile.am | 6 +- >> tests/run-strip-remove-keep-ctf.sh | 207 +++++++++++++++++++++++++++++ >> tests/testfile-ctf.bz2 | Bin 0 -> 3317 bytes >> 10 files changed, 304 insertions(+), 22 deletions(-) >> create mode 100755 tests/run-strip-remove-keep-ctf.sh >> create mode 100755 tests/testfile-ctf.bz2 >> >> diff --git a/ChangeLog b/ChangeLog >> index f1a14b5c..2b608866 100644 >> --- a/ChangeLog >> +++ b/ChangeLog >> @@ -1,3 +1,26 @@ >> +2022-05-21 Guillermo E. Martinez <guillermo.e.marti...@oracle.com> >> + >> + * libebl/eblsectionstripp.c (ebl_section_strip_p): Use >> + remove_ctf argument. >> + (SECTION_STRIP_P): Likewise. >> + * libebl/libebl.h (ebl_section_strip_p): Likewise. >> + * libelf/elf-knowledge.h (SECTION_STRIP_P): Update macro >> + definition to use remove_ctf to determine whether .ctf >> + section is stripped out. >> + * libelf/elf32_checksum.c (elfw2): Use false value for >> + remove_ctf parameter. >> + * src/elfcmp.c (main): Likewise. >> + * src/strip.c (options): Add --remove-ctf option set by >> + remove_ctf variable. >> + (set_remove_special_section_opt): Add new function. >> + (erratic_special_section_opt): Likewise. >> + (parse_opt): Parse new --remove-ctf option. >> + (handle_elf): Adjust .comment and use remove_ctf argument. >> + * tests/Makefile.am (TEST): Add run-strip-remove-keep-ctf.sh >> + and testfile-ctf.bz2. >> + * tests/run-strip-remove-keep-ctf.sh: Add new testcase. >> + * tests/testfile-ctf.bz2: Add new test harness. >> + >> 2022-05-02 Mark Wielaard <m...@klomp.org> >> >> * Makefile.am (AM_DISTCHECK_CONFIGURE_FLAGS): Remove >> diff --git a/libebl/eblsectionstripp.c b/libebl/eblsectionstripp.c >> index a5624ffe..f26cc170 100644 >> --- a/libebl/eblsectionstripp.c >> +++ b/libebl/eblsectionstripp.c >> @@ -37,7 +37,7 @@ >> bool >> ebl_section_strip_p (Ebl *ebl, const GElf_Shdr *shdr, >> const char *name, bool remove_comment, >> - bool only_remove_debug) >> + bool only_remove_debug, bool remove_ctf) >> { >> /* If only debug information should be removed check the name. There >> is unfortunately no other way. */ >> @@ -66,5 +66,5 @@ ebl_section_strip_p (Ebl *ebl, const GElf_Shdr *shdr, >> return false; >> } >> >> - return SECTION_STRIP_P (shdr, name, remove_comment); >> + return SECTION_STRIP_P (shdr, name, remove_comment, remove_ctf); >> } >> diff --git a/libebl/libebl.h b/libebl/libebl.h >> index 731001d3..067b769e 100644 >> --- a/libebl/libebl.h >> +++ b/libebl/libebl.h >> @@ -205,7 +205,7 @@ extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc); >> /* Check whether section should be stripped. */ >> extern bool ebl_section_strip_p (Ebl *ebl, >> const GElf_Shdr *shdr, const char *name, >> - bool remove_comment, bool only_remove_debug); >> + bool remove_comment, bool only_remove_debug, >> bool remove_ctf); >> >> /* Check if backend uses a bss PLT in this file. */ >> extern bool ebl_bss_plt_p (Ebl *ebl); >> diff --git a/libelf/elf-knowledge.h b/libelf/elf-knowledge.h >> index 6e005fa5..903a0f4f 100644 >> --- a/libelf/elf-knowledge.h >> +++ b/libelf/elf-knowledge.h >> @@ -34,7 +34,7 @@ >> >> >> /* Test whether a section can be stripped or not. */ >> -#define SECTION_STRIP_P(shdr, name, remove_comment) \ >> +#define SECTION_STRIP_P(shdr, name, remove_comment, remove_ctf) \ >> /* Sections which are allocated are not removed. */ >> \ >> (((shdr)->sh_flags & SHF_ALLOC) == 0 >> \ >> /* We never remove .note sections. */ \ >> @@ -45,7 +45,10 @@ >> && strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." - 1) != 0\ >> /* We remove .comment sections only if explicitly told to do so. */\ >> && (remove_comment \ >> - || strcmp (name, ".comment") != 0)))) >> + || strcmp (name, ".comment") != 0) \ >> + /* We remove .ctf sections only if explicitly told to do so. */\ >> + && (remove_ctf \ >> + || strcmp (name, ".ctf") != 0)))) >> >> >> /* Test whether `sh_info' field in section header contains a section >> diff --git a/libelf/elf32_checksum.c b/libelf/elf32_checksum.c >> index c5f27bbe..190bad7d 100644 >> --- a/libelf/elf32_checksum.c >> +++ b/libelf/elf32_checksum.c >> @@ -105,7 +105,7 @@ elfw2(LIBELFBITS,checksum) (Elf *elf) >> >> if (SECTION_STRIP_P (shdr, >> INTUSE(elf_strptr) (elf, shstrndx, shdr->sh_name), >> - true)) >> + true, false)) >> /* The section can be stripped. Don't use it. */ >> continue; >> >> diff --git a/src/elfcmp.c b/src/elfcmp.c >> index 21d8d9dc..76f15735 100644 >> --- a/src/elfcmp.c >> +++ b/src/elfcmp.c >> @@ -270,7 +270,7 @@ main (int argc, char *argv[]) >> sname1 = elf_strptr (elf1, shstrndx1, shdr1->sh_name); >> } >> while (scn1 != NULL && shdr1 != NULL >> - && ebl_section_strip_p (ebl1, shdr1, sname1, true, false)); >> + && ebl_section_strip_p (ebl1, shdr1, sname1, true, false, false)); >> >> GElf_Shdr shdr2_mem; >> GElf_Shdr *shdr2; >> @@ -283,7 +283,7 @@ main (int argc, char *argv[]) >> sname2 = elf_strptr (elf2, shstrndx2, shdr2->sh_name); >> } >> while (scn2 != NULL && shdr2 != NULL >> - && ebl_section_strip_p (ebl2, shdr2, sname2, true, false)); >> + && ebl_section_strip_p (ebl2, shdr2, sname2, true, false, false)); >> >> if (scn1 == NULL || scn2 == NULL || shdr1 == NULL || shdr2 == NULL) >> break; >> diff --git a/src/strip.c b/src/strip.c >> index 452b1279..6f79a1d0 100644 >> --- a/src/strip.c >> +++ b/src/strip.c >> @@ -62,6 +62,7 @@ ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT; >> #define OPT_RELOC_DEBUG 0x103 >> #define OPT_KEEP_SECTION 0x104 >> #define OPT_RELOC_DEBUG_ONLY 0x105 >> +#define OPT_REMOVE_CTF 0x106 >> >> >> /* Definitions of arguments for argp functions. */ >> @@ -87,6 +88,8 @@ static const struct argp_option options[] = >> N_("Similar to --reloc-debug-sections, but resolve all trivial > relocations between debug sections in place. No other stripping is > performed (operation is not reversible, incompatible with -f, -g, > --remove-comment and --remove-section)"), 0 }, >> { "remove-comment", OPT_REMOVE_COMMENT, NULL, 0, >> N_("Remove .comment section"), 0 }, >> + { "remove-ctf", OPT_REMOVE_CTF, NULL, 0, >> + N_("Remove .ctf section"), 0 }, >> { "remove-section", 'R', "SECTION", 0, N_("Remove the named section. > SECTION is an extended wildcard pattern. May be given more than once. > Only non-allocated sections can be removed."), 0 }, >> { "keep-section", OPT_KEEP_SECTION, "SECTION", 0, N_("Keep the named > section. SECTION is an extended wildcard pattern. May be given more > than once."), 0 }, >> { "permissive", OPT_PERMISSIVE, NULL, 0, >> @@ -150,6 +153,9 @@ static bool preserve_dates; >> /* If true .comment sections will be removed. */ >> static bool remove_comment; >> >> +/* If true .ctf sections will be removed. */ >> +static bool remove_ctf; >> + >> /* If true remove all debug sections. */ >> static bool remove_debug; >> >> @@ -217,6 +223,48 @@ section_name_matches (struct section_pattern *patterns, >> const char *name) >> return false; >> } >> >> +static void >> +set_remove_special_section_opt (const char *arg) >> +{ >> + if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) >> + remove_comment = true; >> + else if (fnmatch (arg, ".ctf", FNM_EXTMATCH) == 0) >> + remove_ctf = true; >> +} >> + >> +static error_t >> +erratic_special_section_opt (struct argp_state *state) >> +{ >> + int s; >> + struct { >> + const char *name; >> + bool remove; >> + } special_secs[] = { >> + { >> + .name = ".comment", >> + .remove = remove_comment >> + }, >> + { >> + .name = ".ctf", >> + .remove = remove_ctf >> + }, >> + { >> + .name = NULL, >> + } >> + }; >> + >> + for (s = 0; special_secs[s].name; ++s) >> + if (special_secs[s].remove == true >> + && section_name_matches (keep_secs, special_secs[s].name)) >> + { >> + argp_error (state, >> + _("cannot both keep and remove %s section"), >> + special_secs[s].name); >> + return EINVAL; >> + } >> + >> + return 0; >> +} >> >> int >> main (int argc, char *argv[]) >> @@ -325,9 +373,12 @@ parse_opt (int key, char *arg, struct argp_state *state) >> remove_comment = true; >> break; >> >> + case OPT_REMOVE_CTF: >> + remove_ctf = true; >> + break; >> + >> case 'R': >> - if (fnmatch (arg, ".comment", FNM_EXTMATCH) == 0) >> - remove_comment = true; >> + set_remove_special_section_opt (arg); >> add_pattern (&remove_secs, arg); >> break; >> >> @@ -353,13 +404,8 @@ parse_opt (int key, char *arg, struct argp_state *state) >> break; >> >> case ARGP_KEY_SUCCESS: >> - if (remove_comment == true >> - && section_name_matches (keep_secs, ".comment")) >> - { >> - argp_error (state, >> - _("cannot both keep and remove .comment section")); >> - return EINVAL; >> - } >> + if (erratic_special_section_opt (state)) >> + return EINVAL; >> break; >> >> default: >> @@ -1358,7 +1404,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, >> const char *fname, >> all sections which are not used at runtime are stripped out. But >> there are a few exceptions: >> >> - - special sections named ".comment" and ".note" are kept >> + - special sections named ".comment", ".note" and ".ctf" are kept >> - OS or architecture specific sections are kept since we might not >> know how to handle them >> - if a section is referred to from a section which is not removed >> @@ -1371,7 +1417,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, >> const char *fname, >> if (remove_shdrs ? !(shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) >> : (ebl_section_strip_p (ebl, &shdr_info[cnt].shdr, >> shdr_info[cnt].name, remove_comment, >> - remove_debug) >> + remove_debug, remove_ctf) >> || cnt == shstrndx >> || section_name_matches (remove_secs, shdr_info[cnt].name))) >> { >> @@ -1534,7 +1580,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, >> const char *fname, >> &shdr_info[scnidx].shdr, >> shdr_info[scnidx].name, >> remove_comment, >> - remove_debug) >> + remove_debug, >> + remove_ctf) >> && ebl_data_marker_symbol (ebl, sym, >> elf_strptr (elf, >> shdr_info[cnt].shdr.sh_link, >> diff --git a/tests/Makefile.am b/tests/Makefile.am >> index 84c3950a..f30d958e 100644 >> --- a/tests/Makefile.am >> +++ b/tests/Makefile.am >> @@ -197,7 +197,8 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh >> newfile test-nlist \ >> msg_tst system-elf-libelf-test \ >> $(asm_TESTS) run-disasm-bpf.sh run-low_high_pc-dw-form-indirect.sh \ >> run-nvidia-extended-linemap-libdw.sh >> run-nvidia-extended-linemap-readelf.sh \ >> - run-readelf-dw-form-indirect.sh run-strip-largealign.sh >> + run-readelf-dw-form-indirect.sh run-strip-largealign.sh \ >> + run-strip-remove-keep-ctf.sh >> >> if !BIARCH >> export ELFUTILS_DISABLE_BIARCH = 1 >> @@ -580,7 +581,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh >> \ >> run-readelf-dw-form-indirect.sh testfile-dw-form-indirect.bz2 \ >> run-nvidia-extended-linemap-libdw.sh >> run-nvidia-extended-linemap-readelf.sh \ >> testfile_nvidia_linemap.bz2 \ >> - testfile-largealign.o.bz2 run-strip-largealign.sh >> + testfile-largealign.o.bz2 run-strip-largealign.sh \ >> + testfile-ctf.bz2 run-strip-remove-keep-ctf.sh >> >> >> if USE_VALGRIND >> diff --git a/tests/run-strip-remove-keep-ctf.sh >> b/tests/run-strip-remove-keep-ctf.sh >> new file mode 100755 >> index 00000000..1a9bd93b >> --- /dev/null >> +++ b/tests/run-strip-remove-keep-ctf.sh >> @@ -0,0 +1,207 @@ >> +#! /bin/sh >> +# Copyright (C) 2022 Oracle, Inc. >> +# This file is part of elfutils. >> +# >> +# This file is free software; you can redistribute it and/or modify >> +# it under the terms of the GNU General Public License as published by >> +# the Free Software Foundation; either version 3 of the License, or >> +# (at your option) any later version. >> +# >> +# elfutils is distributed in the hope that it will be useful, but >> +# WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program. If not, see <http://www.gnu.org/licenses/>. >> + >> +. $srcdir/test-subr.sh >> + >> +# strip -o output and -f debug files >> +tempfiles testfile.elf testfile.debug >> + >> +# A random 32bit testfile >> +testfiles testfile-ctf >> + >> +# strip should keep .ctf section >> +echo strip testfile-ctf >> +testrun ${abs_top_builddir}/src/strip -o testfile.elf -f testfile.debug >> testfile-ctf >> +echo elflint testfile.elf >> +testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf >> +echo elflint testfile.debug >> +testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug >> +echo readelf testfile.elf >> +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF >> +There are 30 section headers, starting at offset 0x3330: >> + >> +Section Headers: >> +[Nr] Name Type Addr Off Size >> ES Flags Lk Inf Al >> +[ 0] NULL 0000000000000000 00000000 00000000 >> 0 0 0 0 >> +[ 1] .interp PROGBITS 0000000000400318 00000318 0000001c >> 0 A 0 0 1 >> +[ 2] .note.gnu.property NOTE 0000000000400338 00000338 00000020 >> 0 A 0 0 8 >> +[ 3] .note.ABI-tag NOTE 0000000000400358 00000358 00000020 >> 0 A 0 0 4 >> +[ 4] .hash HASH 0000000000400378 00000378 00000028 >> 4 A 6 0 8 >> +[ 5] .gnu.hash GNU_HASH 00000000004003a0 000003a0 0000001c >> 0 A 6 0 8 >> +[ 6] .dynsym DYNSYM 00000000004003c0 000003c0 00000078 >> 24 A 7 1 8 >> +[ 7] .dynstr STRTAB 0000000000400438 00000438 00000057 >> 0 A 0 0 1 >> +[ 8] .gnu.version GNU_versym 0000000000400490 00000490 0000000a >> 2 A 6 0 2 >> +[ 9] .gnu.version_r GNU_verneed 00000000004004a0 000004a0 00000030 >> 0 A 7 1 8 >> +[10] .rela.dyn RELA 00000000004004d0 000004d0 00000030 >> 24 A 6 0 8 >> +[11] .rela.plt RELA 0000000000400500 00000500 00000030 >> 24 AI 6 23 8 >> +[12] .init PROGBITS 0000000000401000 00001000 00000017 >> 0 AX 0 0 4 >> +[13] .plt PROGBITS 0000000000401020 00001020 00000030 >> 16 AX 0 0 16 >> +[14] .text PROGBITS 0000000000401050 00001050 000001d1 >> 0 AX 0 0 16 >> +[15] .fini PROGBITS 0000000000401224 00001224 00000009 >> 0 AX 0 0 4 >> +[16] .rodata PROGBITS 0000000000402000 00002000 00000010 >> 0 A 0 0 4 >> +[17] .eh_frame_hdr PROGBITS 0000000000402010 00002010 0000003c >> 0 A 0 0 4 >> +[18] .eh_frame PROGBITS 0000000000402050 00002050 00000100 >> 0 A 0 0 8 >> +[19] .init_array INIT_ARRAY 0000000000403e00 00002e00 00000008 >> 8 WA 0 0 8 >> +[20] .fini_array FINI_ARRAY 0000000000403e08 00002e08 00000008 >> 8 WA 0 0 8 >> +[21] .dynamic DYNAMIC 0000000000403e10 00002e10 000001e0 >> 16 WA 7 0 8 >> +[22] .got PROGBITS 0000000000403ff0 00002ff0 00000010 >> 8 WA 0 0 8 >> +[23] .got.plt PROGBITS 0000000000404000 00003000 00000028 >> 8 WA 0 0 8 >> +[24] .data PROGBITS 0000000000404028 00003028 00000010 >> 0 WA 0 0 8 >> +[25] .bss NOBITS 0000000000404038 00003038 00000008 >> 0 WA 0 0 4 >> +[26] .comment PROGBITS 0000000000000000 00003038 0000002a >> 1 MS 0 0 1 >> +[27] .ctf PROGBITS 0000000000000000 00003062 000001af >> 0 0 0 1 >> +[28] .gnu_debuglink PROGBITS 0000000000000000 00003214 00000014 >> 0 0 0 4 >> +[29] .shstrtab STRTAB 0000000000000000 00003228 00000107 >> 0 0 0 1 >> + >> +EOF >> +echo readelf testfile.debug >> +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF >> +There are 37 section headers, starting at offset 0xdf0: >> + >> +Section Headers: >> +[Nr] Name Type Addr Off Size >> ES Flags Lk Inf Al >> +[ 0] NULL 0000000000000000 00000000 00000000 >> 0 0 0 0 >> +[ 1] .interp NOBITS 0000000000400318 00000318 0000001c >> 0 A 0 0 1 >> +[ 2] .note.gnu.property NOTE 0000000000400338 00000318 00000020 >> 0 A 0 0 8 >> +[ 3] .note.ABI-tag NOTE 0000000000400358 00000338 00000020 >> 0 A 0 0 4 >> +[ 4] .hash NOBITS 0000000000400378 00000358 00000028 >> 4 A 6 0 8 >> +[ 5] .gnu.hash NOBITS 00000000004003a0 00000358 0000001c >> 0 A 6 0 8 >> +[ 6] .dynsym NOBITS 00000000004003c0 00000358 00000078 >> 24 A 7 1 8 >> +[ 7] .dynstr NOBITS 0000000000400438 00000358 00000057 >> 0 A 0 0 1 >> +[ 8] .gnu.version NOBITS 0000000000400490 00000358 0000000a >> 2 A 6 0 2 >> +[ 9] .gnu.version_r NOBITS 00000000004004a0 00000358 00000030 >> 0 A 7 1 8 >> +[10] .rela.dyn NOBITS 00000000004004d0 00000358 00000030 >> 24 A 6 0 8 >> +[11] .rela.plt NOBITS 0000000000400500 00000358 00000030 >> 24 AI 6 23 8 >> +[12] .init NOBITS 0000000000401000 00000358 00000017 >> 0 AX 0 0 4 >> +[13] .plt NOBITS 0000000000401020 00000360 00000030 >> 16 AX 0 0 16 >> +[14] .text NOBITS 0000000000401050 00000360 000001d1 >> 0 AX 0 0 16 >> +[15] .fini NOBITS 0000000000401224 00000360 00000009 >> 0 AX 0 0 4 >> +[16] .rodata NOBITS 0000000000402000 00000360 00000010 >> 0 A 0 0 4 >> +[17] .eh_frame_hdr NOBITS 0000000000402010 00000360 0000003c >> 0 A 0 0 4 >> +[18] .eh_frame NOBITS 0000000000402050 00000360 00000100 >> 0 A 0 0 8 >> +[19] .init_array NOBITS 0000000000403e00 00000360 00000008 >> 8 WA 0 0 8 >> +[20] .fini_array NOBITS 0000000000403e08 00000360 00000008 >> 8 WA 0 0 8 >> +[21] .dynamic NOBITS 0000000000403e10 00000360 000001e0 >> 16 WA 7 0 8 >> +[22] .got NOBITS 0000000000403ff0 00000360 00000010 >> 8 WA 0 0 8 >> +[23] .got.plt NOBITS 0000000000404000 00000360 00000028 >> 8 WA 0 0 8 >> +[24] .data NOBITS 0000000000404028 00000360 00000010 >> 0 WA 0 0 8 >> +[25] .bss NOBITS 0000000000404038 00000360 00000008 >> 0 WA 0 0 4 >> +[26] .comment NOBITS 0000000000000000 00000360 0000002a >> 1 MS 0 0 1 >> +[27] .ctf NOBITS 0000000000000000 00000360 000001af >> 0 0 0 1 >> +[28] .debug_aranges PROGBITS 0000000000000000 00000360 00000030 >> 0 0 0 1 >> +[29] .debug_info PROGBITS 0000000000000000 00000390 00000121 >> 0 0 0 1 >> +[30] .debug_abbrev PROGBITS 0000000000000000 000004b1 000000b6 >> 0 0 0 1 >> +[31] .debug_line PROGBITS 0000000000000000 00000567 00000063 >> 0 0 0 1 >> +[32] .debug_str PROGBITS 0000000000000000 000005ca 000000ba >> 1 MS 0 0 1 >> +[33] .debug_line_str PROGBITS 0000000000000000 00000684 0000005c >> 1 MS 0 0 1 >> +[34] .symtab SYMTAB 0000000000000000 000006e0 000003c0 >> 24 35 21 8 >> +[35] .strtab STRTAB 0000000000000000 00000aa0 000001f1 >> 0 0 0 1 >> +[36] .shstrtab STRTAB 0000000000000000 00000c91 00000158 >> 0 0 0 1 >> + >> +EOF >> + >> +# Explicitly removes .ctf section >> +echo strip --remove-ctf testfile >> +testrun ${abs_top_builddir}/src/strip --remove-ctf -o testfile.elf > -f testfile.debug testfile-ctf >> +echo elflint testfile.elf >> +testrun ${abs_top_builddir}/src/elflint --gnu testfile.elf >> +echo elflint testfile.debug >> +testrun ${abs_top_builddir}/src/elflint --gnu -d testfile.debug >> +echo readelf testfile.elf >> +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.elf <<\EOF >> +There are 29 section headers, starting at offset 0x3180: >> + >> +Section Headers: >> +[Nr] Name Type Addr Off Size >> ES Flags Lk Inf Al >> +[ 0] NULL 0000000000000000 00000000 00000000 >> 0 0 0 0 >> +[ 1] .interp PROGBITS 0000000000400318 00000318 0000001c >> 0 A 0 0 1 >> +[ 2] .note.gnu.property NOTE 0000000000400338 00000338 00000020 >> 0 A 0 0 8 >> +[ 3] .note.ABI-tag NOTE 0000000000400358 00000358 00000020 >> 0 A 0 0 4 >> +[ 4] .hash HASH 0000000000400378 00000378 00000028 >> 4 A 6 0 8 >> +[ 5] .gnu.hash GNU_HASH 00000000004003a0 000003a0 0000001c >> 0 A 6 0 8 >> +[ 6] .dynsym DYNSYM 00000000004003c0 000003c0 00000078 >> 24 A 7 1 8 >> +[ 7] .dynstr STRTAB 0000000000400438 00000438 00000057 >> 0 A 0 0 1 >> +[ 8] .gnu.version GNU_versym 0000000000400490 00000490 0000000a >> 2 A 6 0 2 >> +[ 9] .gnu.version_r GNU_verneed 00000000004004a0 000004a0 00000030 >> 0 A 7 1 8 >> +[10] .rela.dyn RELA 00000000004004d0 000004d0 00000030 >> 24 A 6 0 8 >> +[11] .rela.plt RELA 0000000000400500 00000500 00000030 >> 24 AI 6 23 8 >> +[12] .init PROGBITS 0000000000401000 00001000 00000017 >> 0 AX 0 0 4 >> +[13] .plt PROGBITS 0000000000401020 00001020 00000030 >> 16 AX 0 0 16 >> +[14] .text PROGBITS 0000000000401050 00001050 000001d1 >> 0 AX 0 0 16 >> +[15] .fini PROGBITS 0000000000401224 00001224 00000009 >> 0 AX 0 0 4 >> +[16] .rodata PROGBITS 0000000000402000 00002000 00000010 >> 0 A 0 0 4 >> +[17] .eh_frame_hdr PROGBITS 0000000000402010 00002010 0000003c >> 0 A 0 0 4 >> +[18] .eh_frame PROGBITS 0000000000402050 00002050 00000100 >> 0 A 0 0 8 >> +[19] .init_array INIT_ARRAY 0000000000403e00 00002e00 00000008 >> 8 WA 0 0 8 >> +[20] .fini_array FINI_ARRAY 0000000000403e08 00002e08 00000008 >> 8 WA 0 0 8 >> +[21] .dynamic DYNAMIC 0000000000403e10 00002e10 000001e0 >> 16 WA 7 0 8 >> +[22] .got PROGBITS 0000000000403ff0 00002ff0 00000010 >> 8 WA 0 0 8 >> +[23] .got.plt PROGBITS 0000000000404000 00003000 00000028 >> 8 WA 0 0 8 >> +[24] .data PROGBITS 0000000000404028 00003028 00000010 >> 0 WA 0 0 8 >> +[25] .bss NOBITS 0000000000404038 00003038 00000008 >> 0 WA 0 0 4 >> +[26] .comment PROGBITS 0000000000000000 00003038 0000002a >> 1 MS 0 0 1 >> +[27] .gnu_debuglink PROGBITS 0000000000000000 00003064 00000014 >> 0 0 0 4 >> +[28] .shstrtab STRTAB 0000000000000000 00003078 00000102 >> 0 0 0 1 >> + >> +EOF >> +echo readelf testfile.debug >> +testrun_compare ${abs_top_builddir}/src/readelf -S testfile.debug <<\EOF >> +There are 37 section headers, starting at offset 0xfa0: >> + >> +Section Headers: >> +[Nr] Name Type Addr Off Size >> ES Flags Lk Inf Al >> +[ 0] NULL 0000000000000000 00000000 00000000 >> 0 0 0 0 >> +[ 1] .interp NOBITS 0000000000400318 00000318 0000001c >> 0 A 0 0 1 >> +[ 2] .note.gnu.property NOTE 0000000000400338 00000318 00000020 >> 0 A 0 0 8 >> +[ 3] .note.ABI-tag NOTE 0000000000400358 00000338 00000020 >> 0 A 0 0 4 >> +[ 4] .hash NOBITS 0000000000400378 00000358 00000028 >> 4 A 6 0 8 >> +[ 5] .gnu.hash NOBITS 00000000004003a0 00000358 0000001c >> 0 A 6 0 8 >> +[ 6] .dynsym NOBITS 00000000004003c0 00000358 00000078 >> 24 A 7 1 8 >> +[ 7] .dynstr NOBITS 0000000000400438 00000358 00000057 >> 0 A 0 0 1 >> +[ 8] .gnu.version NOBITS 0000000000400490 00000358 0000000a >> 2 A 6 0 2 >> +[ 9] .gnu.version_r NOBITS 00000000004004a0 00000358 00000030 >> 0 A 7 1 8 >> +[10] .rela.dyn NOBITS 00000000004004d0 00000358 00000030 >> 24 A 6 0 8 >> +[11] .rela.plt NOBITS 0000000000400500 00000358 00000030 >> 24 AI 6 23 8 >> +[12] .init NOBITS 0000000000401000 00000358 00000017 >> 0 AX 0 0 4 >> +[13] .plt NOBITS 0000000000401020 00000360 00000030 >> 16 AX 0 0 16 >> +[14] .text NOBITS 0000000000401050 00000360 000001d1 >> 0 AX 0 0 16 >> +[15] .fini NOBITS 0000000000401224 00000360 00000009 >> 0 AX 0 0 4 >> +[16] .rodata NOBITS 0000000000402000 00000360 00000010 >> 0 A 0 0 4 >> +[17] .eh_frame_hdr NOBITS 0000000000402010 00000360 0000003c >> 0 A 0 0 4 >> +[18] .eh_frame NOBITS 0000000000402050 00000360 00000100 >> 0 A 0 0 8 >> +[19] .init_array NOBITS 0000000000403e00 00000360 00000008 >> 8 WA 0 0 8 >> +[20] .fini_array NOBITS 0000000000403e08 00000360 00000008 >> 8 WA 0 0 8 >> +[21] .dynamic NOBITS 0000000000403e10 00000360 000001e0 >> 16 WA 7 0 8 >> +[22] .got NOBITS 0000000000403ff0 00000360 00000010 >> 8 WA 0 0 8 >> +[23] .got.plt NOBITS 0000000000404000 00000360 00000028 >> 8 WA 0 0 8 >> +[24] .data NOBITS 0000000000404028 00000360 00000010 >> 0 WA 0 0 8 >> +[25] .bss NOBITS 0000000000404038 00000360 00000008 >> 0 WA 0 0 4 >> +[26] .comment NOBITS 0000000000000000 00000360 0000002a >> 1 MS 0 0 1 >> +[27] .ctf PROGBITS 0000000000000000 00000360 000001af >> 0 0 0 1 >> +[28] .debug_aranges PROGBITS 0000000000000000 0000050f 00000030 >> 0 0 0 1 >> +[29] .debug_info PROGBITS 0000000000000000 0000053f 00000121 >> 0 0 0 1 >> +[30] .debug_abbrev PROGBITS 0000000000000000 00000660 000000b6 >> 0 0 0 1 >> +[31] .debug_line PROGBITS 0000000000000000 00000716 00000063 >> 0 0 0 1 >> +[32] .debug_str PROGBITS 0000000000000000 00000779 000000ba >> 1 MS 0 0 1 >> +[33] .debug_line_str PROGBITS 0000000000000000 00000833 0000005c >> 1 MS 0 0 1 >> +[34] .symtab SYMTAB 0000000000000000 00000890 000003c0 >> 24 35 21 8 >> +[35] .strtab STRTAB 0000000000000000 00000c50 000001f1 >> 0 0 0 1 >> +[36] .shstrtab STRTAB 0000000000000000 00000e41 00000158 >> 0 0 0 1 >> + >> +EOF >> + >> +exit 0 >> diff --git a/tests/testfile-ctf.bz2 b/tests/testfile-ctf.bz2 >> new file mode 100755 >> index >> 0000000000000000000000000000000000000000..af909af0fe7b7d88f11426e349e867e39fddfafd >> GIT binary patch >> literal 3317 >> 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 >> >> literal 0 >> HcmV?d00001 >> >> >> base-commit: 27414ecffd6cc71c9af7bacc75ce448121ac005f >> -- >> 2.35.1 >>