From d4ac1f878ecef58f1e4b4ff0cbfb4b475656eaf4 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 7 Aug 2015 10:28:42 -0700 Subject: [PATCH] Check sh_type/sh_flags/sh_addralign/sh_entsize when copying sh_link/sh_info When copying the sh_link and sh_info fields in stripped section headers, we also check if the sh_type, sh_flags, /sh_addralign and sh_entsize fields of the output section match the output. Since --only-keep-debug turns all non-debug sections into SHT_NOBITS sections, the output SHT_NOBITS type matches any input type. bfd/ PR binutils/18785 * elf.c (_bfd_elf_copy_private_bfd_data): When copying the sh_link and sh_info fields in stripped section headers, we also check if the sh_type, sh_flags, /sh_addralign and sh_entsize fields of the output section match the output. Since --only-keep-debug turns all non-debug sections into SHT_NOBITS sections, the output SHT_NOBITS type matches any input type. binutils/testsuite/ PR binutils/18785 * binutils-all/objcopy.exp: Run strip-12. * binutils-all/strip-12.d: New file. * binutils-all/strip-12.s: Likewise. --- bfd/ChangeLog | 10 ++++++++++ bfd/elf.c | 9 ++++++++- binutils/testsuite/ChangeLog | 7 +++++++ binutils/testsuite/binutils-all/objcopy.exp | 1 + binutils/testsuite/binutils-all/strip-12.d | 7 +++++++ binutils/testsuite/binutils-all/strip-12.s | 6 ++++++ 6 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 binutils/testsuite/binutils-all/strip-12.d create mode 100644 binutils/testsuite/binutils-all/strip-12.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 36fae0eb91..c319f80b8f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2015-08-07 H.J. Lu + + PR binutils/18785 + * elf.c (_bfd_elf_copy_private_bfd_data): When copying the + sh_link and sh_info fields in stripped section headers, we also + check if the sh_type, sh_flags, /sh_addralign and sh_entsize + fields of the output section match the output. Since + --only-keep-debug turns all non-debug sections into SHT_NOBITS + sections, the output SHT_NOBITS type matches any input type. + 2015-08-07 H.J. Lu PR ld/18720 diff --git a/bfd/elf.c b/bfd/elf.c index 67e4240dac..9e401c8f04 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1233,7 +1233,14 @@ _bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd) { Elf_Internal_Shdr * iheader = iheaders[j]; - if (iheader->sh_type != SHT_NOBITS + /* Since --only-keep-debug turns all non-debug sections + into SHT_NOBITS sections, the output SHT_NOBITS type + matches any input type. */ + if ((oheader->sh_type == SHT_NOBITS + || oheader->sh_type == oheader->sh_type) + && iheader->sh_flags == oheader->sh_flags + && iheader->sh_addralign == oheader->sh_addralign + && iheader->sh_entsize == oheader->sh_entsize && iheader->sh_size == oheader->sh_size && iheader->sh_addr == oheader->sh_addr && (iheader->sh_info != oheader->sh_info diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index 8f8f3c2276..4f60f93fd3 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-08-07 H.J. Lu + + PR binutils/18785 + * binutils-all/objcopy.exp: Run strip-12. + * binutils-all/strip-12.d: New file. + * binutils-all/strip-12.s: Likewise. + 2015-08-07 Andrew Burgess * binutils-all/objcopy.exp: Run new symbol tests. diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index 75514e42ce..cb8e33b5f7 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -1033,6 +1033,7 @@ if [is_elf_format] { run_dump_test "strip-7" run_dump_test "strip-8" run_dump_test "strip-9" + run_dump_test "strip-12" # Non-EABI ARM targets will set OSABI to ARM # The V850 sets the OSABI to UNIX - System V if { ![istarget "*-*-hpux*"] diff --git a/binutils/testsuite/binutils-all/strip-12.d b/binutils/testsuite/binutils-all/strip-12.d new file mode 100644 index 0000000000..a33faab2f6 --- /dev/null +++ b/binutils/testsuite/binutils-all/strip-12.d @@ -0,0 +1,7 @@ +#PROG: strip +#strip: +#readelf: -S --wide + +#... + \[[ 0-9]+\] \.bss[ \t]+NOBITS[ \t0-9a-f]+WA[ \t]+0[ \t]+0[ \t]+1 +#pass diff --git a/binutils/testsuite/binutils-all/strip-12.s b/binutils/testsuite/binutils-all/strip-12.s new file mode 100644 index 0000000000..46b729f9a2 --- /dev/null +++ b/binutils/testsuite/binutils-all/strip-12.s @@ -0,0 +1,6 @@ + .bss + .space 8 + .section .debug_str,"MS",%progbits,1 + .string "" + .section .text.foo,"axG",%progbits,foo,comdat + .byte 0