From: "Jose E. Marchesi" <jose.marchesi@oracle.com>
To: Mark Wielaard <mark@klomp.org>
Cc: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>,
elfutils-devel@sourceware.org, Nick Clifton <nickc@redhat.com>
Subject: Re: [PATCH] strip: keep .ctf section in stripped file
Date: Tue, 31 May 2022 12:26:50 +0200 [thread overview]
Message-ID: <87fskqov4l.fsf@oracle.com> (raw)
In-Reply-To: <YpW+ctd7+qID4FzO@wildebeest.org> (Mark Wielaard's message of "Tue, 31 May 2022 09:06:26 +0200")
[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.martinez@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.martinez@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 <mark@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
>> zcmV<R3<~o?T4*^jL0KkKSuG_=7yt}J|NsC0|NsC0|NsB@|NsC0|Nj5)^>ool$yNRQ
>> z{a*L~|6kw>L^-~iz!v3`m9t8Amleo4T#|O$(vEkAge1Wxr<C$FJxm$^rfpNy{VC~_
>> zCZ;kcq&-ck>NZ63n@P1crqp@}KT>I<Wf+*610eK|K$t<JCYm%FdYS_v>KYBHv}y*X
>> zKqEq8YMum7N$DPx^o=q!(WaROk5FloMuv?8Mu5;70009u4Ff;`4Ff;`8UO$QXb@-s
>> zG#UUj02(yV0Lh>L27#b7Gz@?M84V2p8UWKk0~0}z0iXZ?(8-V(NQ6x^6I1j=^z{j}
>> zjj5sPVj2cOdLRQ4<qZG;8fa;t&<y|pG-v=C02%?H0000qKmZK@0gwP_02(rA00SU2
>> z0000q05sE00j7X7G8qh-007W50BAH~WCV&JK{9A+dSs`jjRa;>O$>&ChDqrF13(6h
>> zhJa`Rp{9dC20#D+00E!?000dQgL<c8iEmKS!J0Mqm%T2W(Q$?hIGR8Z?+mlXMK)vx
>> zJ~zIi1O(xc2HK(}8S80vR`#<cXKOO=oeh|xpoLv%(lodcDal3+qy{2Lepr;muswmU
>> zcLvOhr=;J~s6JS#DhNtKJm|peVqO{MlASBf309883O=agQ}b!irZ5vWh1p$Xli^Nz
>> zNX{g}?*Rx_WAns}^k+<HprzfCa}yeptVd?x#1y&hdZs1MZHWXFpk}iU&b=?B>Pv2z
>> zmT4r<=(QRNWZs^K=JuE9yEN`}PZb1Z2>}WPb36{dd2Ft~PngBR$z(0xTQ6y$-rS-l
>> z-I!@aNf|<WA~F}*I@!a3t^^?pFer3~k<YpoQM0Q+P>=YKK@d%p7<4LK0|Wl-sqR1Z
>> z(#M|P@;JOHpw6`nIu2I@M~(k%d2NB9Jr9zXQV@j0NY_0}#%K`QOI3@OFX0Gd>2oq-
>> zIyBwY-l9P08o0qC!WDBAKx*H9N!psPsj#BBL_mh;6#)<?#CZP7M}LBy+zT#Qx(IV$
>> zV5xdng#egB`#ozdfNSO<Y);wBW63g*!AM|%Z;x(?Byd*kKs;8#kBI;Vk0>o>*TWfl
>> z7u?1lMSU5B_IhfN%7fFL8pUdeHdE^q%Sl6+r5+p#tA&L@yQpqfzfpBfmb*vZ+*GM%
>> zWuYv2R#%n~cW#D|9p07-L^OenNwEQR%1kRXtS~{7Vn%_0mg>cEqLUi{gF%kO2+g#J
>> zu>fN*30Y~0ZVXbf5n$Ma+DS~(L>f(_nQ0Xmr)j3MtwA)~7}8;&Vj#zN1b7Vv163Kl
>> zGOJzls?>~8aTpYs7Mes_5H^xsYtFD&jSyfNc3m(>FvNpUGzwOVZLkn@OiBz%u_SBQ
>> zn-GA+U@A{ndj&It5)`IH1P55}*_x``ZNqG4!J8eF5=F<lG&hXF720h))F8*T<pPw3
>> zXaQ26kr66(cq)ld66C~8StAZ{Tpczi4%@_AuCv-)J4OdB(}_(w>5Iy)Q?3vdvKic#
>> zTO&Z#P!q_u(DJ4k+tkrKrj*bvu)!c^vT}1gjb?;SW;`v^2{tZYR>rnR8*xrfaKXX2
>> zwi_lMMqJ>bi#&2;72;b3M3=KJq#BW5VUv|ME=a*7MhF3X?!XNZQb=NvfWaU@NG#rz
>> zV{2ZB?Exw!oTmP4%^y1=pGw!^qYr~JHpoLa%o9dWrnwYm3s6=F3cj~@+_`sm>$lsD
>> ze=~(w(d6j5cKV;G?^>6g^!<3YKCSj+9&mQXMO0u>q5?T`RHFnj(P11E2A&;A4}lZK
>> zg{I+y0Aqx1YGlxf8P&;zd5MMrNZy6v7Qn+qNeI;V+>5a(&p^c}2`wQ+gxTUSX<syW
>> z&3TNWpll8yW5ETY$pj_rZ0f}r{agz?)Brc`Lt^qSbG%Fl#&9&uFPUvL4Wxo7nBQXx
>> zNfIp}Odv?bS4df}WY`xXXt8FB9LH+5jSK#3Ccs=?FV{}3^^kLyf_0pVN>R8tFf~jf
>> zzM6|}3_AJ2f}=%@V*;A|I-(Z~mZhC<8KI3_#W(qVoCXQN5x7_Fq+*gU(1a0?Lp1_&
>> z>k|_W9fKH<R|k1@hcQ5}TqSG;Ad-?IMow7qaTdZe&*&nBSa0Z1qJIQ_nBvjy(<Lxy
>> zrLeoEM^^;B27sw8)&z)yFPTHvFh^83c0f6EtS->3-=J7k*ao^56QkJA2^hg;&0gL}
>> zYEZVQL{~s-)xR<$(tTV#53cpPidyWwy$zGD(OCDE*Lu@Em;N7~o;ya7%QaLe?D#yy
>> zr?)XO!;s^cjsVXP%uhTbD2E#zUKN`(uFXof$>7(*!x`vd3+;ou#@sY=H(8x(14$6#
>> zSc6c(y(ocjEl8)g6p)e$o3zl@Q-Gv7++56c6Js=-{Aydy`C3$@5s<*JL`0<|@3?CT
>> zECZn0`{N!X&Nry8^sKG)D6av^j0+iCSs}7>d8HDSqctL!DoQj$Fv@9knFoEY$=MFy
>> zuMtd%X56M#DH&`||2Ie%Ck70GgA0lk^}Bur78@u#bCQC#a4@aF#yF(rgUKuBoV5ly
>> z1*+PNr4i}j98#6sl{b>yjEl1Ynf;cEjOH0wv}*D&t=(qLNzcGdoxMES+&CcFFbgmm
>> zu0jl*X=?(mtqDVY)XB)|ZxX@52n<3;fW(6#jWe~WnN#P{D-{XQVX!wDwIJ4o&wzD<
>> z=Ca48Y*G}NLjOk@uLqIZLW>Mk3{q^2J{Bj$Au@XB8b+qTpa;s@EOl;ZBFPqligTXE
>> z#CwG}F_Ty!0oC2fWNThkeNmY{>J|QRYZf&*)@Mg071{CEBHr32lIo*4({84cw}7RH
>> zR-;UiRBCW7qhcH&nh6J!NqdCaDElX@X@$9n)lMp;NJv&;ktmxHT5QugXt_-)K%gZ;
>> zNlu#blvk)!BC-~%T}V)sixEm`q!Oxq#5;<|8s+BPC!R$Fy-<s%s()9!aWqV1Bv7nJ
>> zOo@8Sn~Igq8*nA_c6?FF<>Wat@86!m-m6k%B#8YR;uvH1Nyf9dQ)D*}Q_^PaZSy0o
>> zTLPV*v5(gV2(cgC=JgOEAT%&+o~)g8d2yxIOHrAz3QAYT?xyT0>+G`4Il5iWd~7rx
>> z#hw0NqlxDdwx;vXlvOV|vLO10%Vyexjb3pNht>ZeFLQ@cV8I^7fkKT8lZRncLR}uq
>> zp&HW8uQdI0{f2xMpIxkY&#<gxaorA(s=obZInGgzWr|hG@__jU%Rm-RG9|*DdC$Iq
>> z^=VLF^Hpa@8j88|l<M@AP#ZyldULgCjVgni`KQbh-l|3WXJm+3Ejj{r<tcXTMWq!g
>> z_JV9Mh^3hiO^38-jPFAE`rwcZy&-@Vwk_9>g3{N61ld@okO3k=A1@7Z8?UUe!5*lh
>> zqq1fen!aNM=$sHQ3Q#QxoiSQKt7^iG0*V-@N<D~883~0_`C?vMBLq6!y%X0J_;tY?
>> z<tgN96hy00M3I*iWXWljYSwB?j!Fr*x#Xk|3?u<)n<>94porWR5er0suoG@5TX0Yc
>> zS)nIF!YN1rPg}tXi8H+h825YuI{<A|AFB=F^V$39C?2vAv0b>kEUR$Tbn^uQhfy1p
>> z1+Xd#qqhva#Lx+0a3)0tww7Wh9f4rmvxT)(17{?qq+wU4UE2%DGD9!okg!1uYvc|^
>> z>OwhOYzdGDTosPxN>ykCVMrF$fpNh%v7u$6GA|wrxB(*U0jCg54mPwz<*dh)TfIz1
>> zhnZbPRIjYND#!v<Ov!-QB6uTW$%=v$q5=sDf*K&o(FKzvz#)V*@bPxg!6z@tkv0|y
>> zI94)?C{3OgFGoON7XjEb2x1j-b+9V43m__Bg_~Ib><L0;HUnHR%L4s@P;z3kN!nKe
>> zKwZ;za&|AF14w~+fL&&I%7i?S1WhoSEXOqgX(Uf#xx}f#83QB^N<oUCAWsD_GRQLC
>> zTE#N-4on$HqTFS>uuE!{`8cN}Bus}rW&p88iijd0Yy$uk$!g`XJca&MnbuemV6}lZ
>> zuVI1*nxx=~MOQABpcI6WfpA*_v<Blgr)G~4nTqTi*=vLPbqQL<fuYvamVM$gAk&Om
>> zOmaFo5NL5BD++dQuS}Gewj!&5thp^|twUS3$y%KABOzVOewrfDIjdU?SkNi&_GyZ<
>> zxUWhITve+CkLq2g@D4<D)&p<uyJVMGW@<#ua1T7PLx&PA94k|5l!zIBwMhkP8mAi_
>> zt<&sf)bSj(|59kga!nAPW0&Ea(`jl0cdXZAt%mnjMda$leJs%mZ46l6HdIhqnfP%y
>> zlC7b}5402mM%Q1y%4y2!F^FOR5R}XT5m}}~R$>^-_y{lzo9GAxKnC1%lRLf2hlw{|
>> z=K9FQJM@bKW<U?s0y0tze|y&A#86~fZ)D;VuK)lwttW|^Y5x~;ML1B9EhR}9WKhMn
>>
>> literal 0
>> HcmV?d00001
>>
>>
>> base-commit: 27414ecffd6cc71c9af7bacc75ce448121ac005f
>> --
>> 2.35.1
>>
next prev parent reply other threads:[~2022-05-31 10:28 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-31 2:26 Guillermo E. Martinez
2022-05-31 7:06 ` Mark Wielaard
2022-05-31 10:26 ` Jose E. Marchesi [this message]
2022-05-31 12:50 ` Jose E. Marchesi
2022-06-01 4:34 ` Guillermo E. Martinez
2022-06-01 15:55 ` [PATCHv2] " Guillermo E. Martinez
2022-12-20 21:35 ` Mark Wielaard
2023-02-22 16:42 ` Mark Wielaard
2023-02-22 16:59 ` Jose E. Marchesi
2023-02-22 17:12 ` Guillermo E. Martinez
2023-02-22 23:04 ` Mark Wielaard
2023-02-23 18:34 ` Guillermo E. Martinez
2023-02-23 18:42 ` [PATCH v3] " Guillermo E. Martinez
2023-02-24 11:51 ` Mark Wielaard
2023-02-24 16:48 ` Guillermo E. Martinez
2023-02-28 12:24 ` Mark Wielaard
2023-02-28 12:45 ` Nick Clifton
2023-02-28 12:59 ` Nick Clifton
2023-02-28 14:27 ` Mark Wielaard
2023-03-03 2:40 ` Guillermo E. Martinez
2023-03-03 12:15 ` Mark Wielaard
2023-03-03 12:24 ` Nick Clifton
2023-03-04 14:00 ` Guillermo E. Martinez
2023-03-07 14:50 ` Mark Wielaard
2023-03-07 20:47 ` Guillermo E. Martinez
2023-03-08 17:45 ` Nix
2023-03-09 23:08 ` Mark Wielaard
2022-06-07 13:23 [PATCH] " Nick Clifton
2022-06-30 19:31 ` Jose E. Marchesi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fskqov4l.fsf@oracle.com \
--to=jose.marchesi@oracle.com \
--cc=elfutils-devel@sourceware.org \
--cc=guillermo.e.martinez@oracle.com \
--cc=mark@klomp.org \
--cc=nickc@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).