aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-12-24 22:07:42 +1030
committerAlan Modra <amodra@gmail.com>2014-12-24 23:47:56 +1030
commitca0694adf6d128c2feba16f6374954c191fb5edb (patch)
tree6c359b77f5abe8c9ad9117c824607ed4f6f04a82
parent854399ea9d0d5d5c14b4035bbc0adfe891f26a3d (diff)
downloadfsf-binutils-gdb-ca0694adf6d128c2feba16f6374954c191fb5edb.zip
fsf-binutils-gdb-ca0694adf6d128c2feba16f6374954c191fb5edb.tar.gz
fsf-binutils-gdb-ca0694adf6d128c2feba16f6374954c191fb5edb.tar.bz2
Don't create .eh_frame_hdr on shared lib bfd
If no object files have .eh_frame, but some shared library does, then ld creates a .eh_frame_hdr section using the shared library bfd. This is silly since shared library .eh_frame sections don't contribute to the output .eh_frame and thus no .eh_frame_hdr is needed. Also, the bfd section list and count is cleared for shared libraries, and a zero section count used as a flag in lang_check to omit a call to bfd_merge_private_bfd_data for shared libraries. If we create a section on a shared lib bfd then ld will wrongly attempt to merge the shared library private bfd data. PR 17742 * ld/emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Exclude shared libraries in loop looking for .eh_frame sections. Similarly for build-id loop.
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/emultempl/elf32.em5
2 files changed, 10 insertions, 1 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0b2f058..31eb04e 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-24 Alan Modra <amodra@gmail.com>
+
+ * emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Exclude
+ shared libraries in loop looking for .eh_frame sections.
+ Similarly for build-id loop.
+
2014-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
* emultempl/avrelf.em: Add include of elf/avr.h.
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 137446f..36dee8e 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1015,7 +1015,8 @@ gld${EMULATION_NAME}_after_open (void)
/* Find an ELF input. */
for (abfd = link_info.input_bfds;
abfd != (bfd *) NULL; abfd = abfd->link.next)
- if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+ && bfd_count_sections (abfd) != 0)
break;
/* PR 10555: If there are no ELF input files do not try to
@@ -1053,6 +1054,8 @@ gld${EMULATION_NAME}_after_open (void)
for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
{
+ if (bfd_count_sections (abfd) == 0)
+ continue;
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
elfbfd = abfd;
if (!warn_eh_frame)