diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2010-08-22 19:11:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2010-08-22 19:11:58 +0000 |
commit | a654efd60a7daee081082be0dae2a006759b6ea8 (patch) | |
tree | e0ae2e1a7566088f2d186680174a1a0fe5b46295 /ld | |
parent | 14d8bca30e85638c1f31a83f50ede4ad6a8dd620 (diff) | |
download | gdb-a654efd60a7daee081082be0dae2a006759b6ea8.zip gdb-a654efd60a7daee081082be0dae2a006759b6ea8.tar.gz gdb-a654efd60a7daee081082be0dae2a006759b6ea8.tar.bz2 |
Find an ELF input for --build-id and --eh-frame-hdr.
2010-08-22 H.J. Lu <hongjiu.lu@intel.com>
PR ld/11937
* emultempl/elf32.em (_after_open): Find an ELF input for
--build-id and --eh-frame-hdr.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 43 |
2 files changed, 32 insertions, 17 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 992f6a3..886bd89 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2010-08-22 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/11937 + * emultempl/elf32.em (_after_open): Find an ELF input for + --build-id and --eh-frame-hdr. + 2010-08-20 Maciej W. Rozycki <macro@codesourcery.com> * Makefile.am (eshlelf_fd.c): Correct the name of the tool diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 2decd18..bf4359d 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1065,7 +1065,11 @@ gld${EMULATION_NAME}_after_open (void) asection *s; bfd_size_type size; - abfd = link_info.input_bfds; + /* 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) + break; if (abfd == NULL) { @@ -1120,33 +1124,38 @@ gld${EMULATION_NAME}_after_open (void) if (link_info.eh_frame_hdr && !link_info.traditional_format) { - bfd *abfd; + bfd *abfd, *elfbfd = NULL; + bfd_boolean warn_eh_frame = FALSE; asection *s; for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next) { + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) + elfbfd = abfd; s = bfd_get_section_by_name (abfd, ".eh_frame"); - if (s && s->size > 8 && !bfd_is_abs_section (s->output_section)) - break; + if (s && s->size > 8 && !bfd_is_abs_section (s->output_section)) + warn_eh_frame = TRUE; + if (elfbfd && warn_eh_frame) + break; } - if (abfd) + if (elfbfd) { const struct elf_backend_data *bed; - bed = get_elf_backend_data (abfd); - if (bed == NULL) - s = NULL; - else - s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr", - bed->dynamic_sec_flags - | SEC_READONLY); + bed = get_elf_backend_data (elfbfd); + s = bfd_make_section_with_flags (elfbfd, ".eh_frame_hdr", + bed->dynamic_sec_flags + | SEC_READONLY); if (s != NULL - && bfd_set_section_alignment (abfd, s, 2)) - htab->eh_info.hdr_sec = s; - else - einfo ("%P: warning: Cannot create .eh_frame_hdr section," - " --eh-frame-hdr ignored.\n"); + && bfd_set_section_alignment (elfbfd, s, 2)) + { + htab->eh_info.hdr_sec = s; + warn_eh_frame = FALSE; + } } + if (warn_eh_frame) + einfo ("%P: warning: Cannot create .eh_frame_hdr section," + " --eh-frame-hdr ignored.\n"); } /* Get the list of files which appear in DT_NEEDED entries in |