diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-04-13 02:52:34 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-04-13 02:52:34 +0000 |
commit | c398915025cc1d08213bb8fb38e53908b8057904 (patch) | |
tree | 75e6f85b592f02197f2818a73922b5f280613a23 /binutils | |
parent | e319fa28f9559b7164a0a52e34ebcda1a07341c9 (diff) | |
download | gdb-c398915025cc1d08213bb8fb38e53908b8057904.zip gdb-c398915025cc1d08213bb8fb38e53908b8057904.tar.gz gdb-c398915025cc1d08213bb8fb38e53908b8057904.tar.bz2 |
Don't generate empty reloc sections
binutils/
PR binutils/13947
* objcopy.c (copy_object): Call copy_relocations_in_section
before copy_section.
(skip_section): New.
(copy_relocations_in_section): Likewise.
(copy_section): Use skip_section. Don't copy relocations here.
binutils/testsuite/
PR binutils/13947
* binutils-all/i386/compressed-1b.d: Remove empty REL section.
* binutils-all/i386/compressed-1c.d: Likewise.
* binutils-all/x86-64/compressed-1b.d: Remove empty RELA
section.
* binutils-all/x86-64/compressed-1c.d: Likewise.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 9 | ||||
-rw-r--r-- | binutils/objcopy.c | 73 | ||||
-rw-r--r-- | binutils/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/i386/compressed-1b.d | 9 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/i386/compressed-1c.d | 9 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/x86-64/compressed-1b.d | 9 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/x86-64/compressed-1c.d | 9 |
7 files changed, 91 insertions, 37 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 5c0492c..7b6c219 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,12 @@ +2012-04-12 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/13947 + * objcopy.c (copy_object): Call copy_relocations_in_section + before copy_section. + (skip_section): New. + (copy_relocations_in_section): Likewise. + (copy_section): Use skip_section. Don't copy relocations here. + 2012-04-11 Ryan Mansfield <rmansfield@qnx.com> * objdump.c (dump_bfd): If defaulting to dwarf call diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 230d3e5..a48ac43 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -459,6 +459,7 @@ extern bfd_boolean S3Forced; /* Forward declarations. */ static void setup_section (bfd *, asection *, void *); static void setup_bfd_headers (bfd *, bfd *); +static void copy_relocations_in_section (bfd *, asection *, void *); static void copy_section (bfd *, asection *, void *); static void get_sections (bfd *, asection *, void *); static int compare_section_lma (const void *, const void *); @@ -1885,6 +1886,9 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) bfd_set_symtab (obfd, osympp, symcount); + /* This has to happen before section positions are set. */ + bfd_map_over_sections (ibfd, copy_relocations_in_section, obfd); + /* This has to happen after the symbol table has been set. */ bfd_map_over_sections (ibfd, copy_section, obfd); @@ -2588,44 +2592,56 @@ loser: bfd_nonfatal_message (NULL, obfd, osection, err); } -/* Copy the data of input section ISECTION of IBFD - to an output section with the same name in OBFD. - If stripping then don't copy any relocation info. */ +/* Return TRUE if input section ISECTION should be skipped. */ -static void -copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) +static bfd_boolean +skip_section (bfd *ibfd, sec_ptr isection) { - bfd *obfd = (bfd *) obfdarg; - struct section_list *p; - arelent **relpp; - long relcount; sec_ptr osection; bfd_size_type size; - long relsize; flagword flags; /* If we have already failed earlier on, do not keep on generating complaints now. */ if (status != 0) - return; + return TRUE; + + if (extract_symbol) + return TRUE; if (is_strip_section (ibfd, isection)) - return; + return TRUE; flags = bfd_get_section_flags (ibfd, isection); if ((flags & SEC_GROUP) != 0) - return; + return TRUE; osection = isection->output_section; size = bfd_get_section_size (isection); if (size == 0 || osection == 0) - return; + return TRUE; - if (extract_symbol) + return FALSE; +} + +/* Copy relocations in input section ISECTION of IBFD to an output + section with the same name in OBFDARG. If stripping then don't + copy any relocation info. */ + +static void +copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg) +{ + bfd *obfd = (bfd *) obfdarg; + long relsize; + arelent **relpp; + long relcount; + sec_ptr osection; + + if (skip_section (ibfd, isection)) return; - p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE); + osection = isection->output_section; /* Core files do not need to be relocated. */ if (bfd_get_format (obfd) == bfd_core) @@ -2682,8 +2698,31 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount); if (relcount == 0) - free (relpp); + { + osection->flags &= ~SEC_RELOC; + free (relpp); + } } +} + +/* Copy the data of input section ISECTION of IBFD + to an output section with the same name in OBFD. */ + +static void +copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) +{ + bfd *obfd = (bfd *) obfdarg; + struct section_list *p; + sec_ptr osection; + bfd_size_type size; + + if (skip_section (ibfd, isection)) + return; + + osection = isection->output_section; + size = bfd_get_section_size (isection); + + p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE); if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS) diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index db44b92..797272d 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2012-04-12 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/13947 + * binutils-all/i386/compressed-1b.d: Remove empty REL section. + * binutils-all/i386/compressed-1c.d: Likewise. + + * binutils-all/x86-64/compressed-1b.d: Remove empty RELA + section. + * binutils-all/x86-64/compressed-1c.d: Likewise. + 2012-04-03 Roland McGrath <mcgrathr@google.com> * lib/binutils-common.exp (is_elf_format): Consider *-*-nacl* to diff --git a/binutils/testsuite/binutils-all/i386/compressed-1b.d b/binutils/testsuite/binutils-all/i386/compressed-1b.d index 1e13f6b..d7ffe21 100644 --- a/binutils/testsuite/binutils-all/i386/compressed-1b.d +++ b/binutils/testsuite/binutils-all/i386/compressed-1b.d @@ -5,15 +5,14 @@ #readelf: -S --wide #name: strip on uncompressed debug sections -There are 6 section headers, starting at offset 0x7c: +There are 5 section headers, starting at offset 0x78: Section Headers: \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al \[ 0\] NULL 00000000 000000 000000 00 0 0 0 \[ 1\] .text PROGBITS 00000000 000040 00001b 00 AX 0 0 16 - \[ 2\] .rel.text REL 00000000 00016c 000000 08 0 1 4 - \[ 3\] .data PROGBITS 00000000 00005c 000000 00 WA 0 0 4 - \[ 4\] .bss NOBITS 00000000 00005c 000000 00 WA 0 0 4 - \[ 5\] .shstrtab STRTAB 00000000 00005c 000020 00 0 0 1 + \[ 2\] .data PROGBITS 00000000 00005c 000000 00 WA 0 0 4 + \[ 3\] .bss NOBITS 00000000 00005c 000000 00 WA 0 0 4 + \[ 4\] .shstrtab STRTAB 00000000 00005c 00001c 00 0 0 1 Key to Flags: #... diff --git a/binutils/testsuite/binutils-all/i386/compressed-1c.d b/binutils/testsuite/binutils-all/i386/compressed-1c.d index 1e7467a..3db18fe 100644 --- a/binutils/testsuite/binutils-all/i386/compressed-1c.d +++ b/binutils/testsuite/binutils-all/i386/compressed-1c.d @@ -5,15 +5,14 @@ #readelf: -S --wide #name: strip on compressed debug sections -There are 6 section headers, starting at offset 0x7c: +There are 5 section headers, starting at offset 0x78: Section Headers: \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al \[ 0\] NULL 00000000 000000 000000 00 0 0 0 \[ 1\] .text PROGBITS 00000000 000040 00001b 00 AX 0 0 16 - \[ 2\] .rel.text REL 00000000 00016c 000000 08 0 1 4 - \[ 3\] .data PROGBITS 00000000 00005c 000000 00 WA 0 0 4 - \[ 4\] .bss NOBITS 00000000 00005c 000000 00 WA 0 0 4 - \[ 5\] .shstrtab STRTAB 00000000 00005c 000020 00 0 0 1 + \[ 2\] .data PROGBITS 00000000 00005c 000000 00 WA 0 0 4 + \[ 3\] .bss NOBITS 00000000 00005c 000000 00 WA 0 0 4 + \[ 4\] .shstrtab STRTAB 00000000 00005c 00001c 00 0 0 1 Key to Flags: #... diff --git a/binutils/testsuite/binutils-all/x86-64/compressed-1b.d b/binutils/testsuite/binutils-all/x86-64/compressed-1b.d index 39a8f59..078ccb6 100644 --- a/binutils/testsuite/binutils-all/x86-64/compressed-1b.d +++ b/binutils/testsuite/binutils-all/x86-64/compressed-1b.d @@ -5,15 +5,14 @@ #readelf: -S --wide #name: strip on uncompressed debug sections -There are 6 section headers, starting at offset 0x80: +There are 5 section headers, starting at offset 0x78: Section Headers: \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0 \[ 1\] .text PROGBITS 0000000000000000 000040 000015 00 AX 0 0 16 - \[ 2\] .rela.text RELA 0000000000000000 000200 000000 18 0 1 8 - \[ 3\] .data PROGBITS 0000000000000000 000058 000000 00 WA 0 0 4 - \[ 4\] .bss NOBITS 0000000000000000 000058 000000 00 WA 0 0 4 - \[ 5\] .shstrtab STRTAB 0000000000000000 000058 000021 00 0 0 1 + \[ 2\] .data PROGBITS 0000000000000000 000058 000000 00 WA 0 0 4 + \[ 3\] .bss NOBITS 0000000000000000 000058 000000 00 WA 0 0 4 + \[ 4\] .shstrtab STRTAB 0000000000000000 000058 00001c 00 0 0 1 Key to Flags: #... diff --git a/binutils/testsuite/binutils-all/x86-64/compressed-1c.d b/binutils/testsuite/binutils-all/x86-64/compressed-1c.d index 33adfc1..90a3c2d 100644 --- a/binutils/testsuite/binutils-all/x86-64/compressed-1c.d +++ b/binutils/testsuite/binutils-all/x86-64/compressed-1c.d @@ -5,15 +5,14 @@ #readelf: -S --wide #name: strip on compressed debug sections -There are 6 section headers, starting at offset 0x80: +There are 5 section headers, starting at offset 0x78: Section Headers: \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0 \[ 1\] .text PROGBITS 0000000000000000 000040 000015 00 AX 0 0 16 - \[ 2\] .rela.text RELA 0000000000000000 000200 000000 18 0 1 8 - \[ 3\] .data PROGBITS 0000000000000000 000058 000000 00 WA 0 0 4 - \[ 4\] .bss NOBITS 0000000000000000 000058 000000 00 WA 0 0 4 - \[ 5\] .shstrtab STRTAB 0000000000000000 000058 000021 00 0 0 1 + \[ 2\] .data PROGBITS 0000000000000000 000058 000000 00 WA 0 0 4 + \[ 3\] .bss NOBITS 0000000000000000 000058 000000 00 WA 0 0 4 + \[ 4\] .shstrtab STRTAB 0000000000000000 000058 00001c 00 0 0 1 Key to Flags: #... |