[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
>> 

Reply via email to