public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
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
>> 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
>> 
>> literal 0
>> HcmV?d00001
>> 
>> 
>> base-commit: 27414ecffd6cc71c9af7bacc75ce448121ac005f
>> -- 
>> 2.35.1
>> 

  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).