diff options
author | Alan Modra <amodra@gmail.com> | 2014-12-24 22:07:42 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-12-24 23:47:56 +1030 |
commit | ca0694adf6d128c2feba16f6374954c191fb5edb (patch) | |
tree | 6c359b77f5abe8c9ad9117c824607ed4f6f04a82 | |
parent | 854399ea9d0d5d5c14b4035bbc0adfe891f26a3d (diff) | |
download | fsf-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/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 5 |
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) |