diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-04-20 17:06:58 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-04-20 17:08:55 -0700 |
commit | fbf05aa70d7a6ad3dd92ca718faa4bb383b975ee (patch) | |
tree | 97f3ad2521a068913cf8e0aaafea1747fecf4f0e /ld/ldlang.c | |
parent | 1a7272c0f9080ca18a724c91ab37a10fa45ad9e4 (diff) | |
download | gdb-fbf05aa70d7a6ad3dd92ca718faa4bb383b975ee.zip gdb-fbf05aa70d7a6ad3dd92ca718faa4bb383b975ee.tar.gz gdb-fbf05aa70d7a6ad3dd92ca718faa4bb383b975ee.tar.bz2 |
Move ELF relocation check after lang_gc_sections
Move ELF relocation check after lang_gc_sections so that all the
reference counting code for plt and got relocs can be removed. This
only affects ELF targets which check relocations after opening all
input file.
* ldlang.c (lang_check_relocs): New function.
(lang_process): Call lang_check_relocs after lang_gc_sections.
* emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Don't
call _bfd_elf_link_check_relocs here.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index 856e3e2..2ae3640 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -6778,6 +6778,27 @@ lang_add_gc_name (const char * name) link_info.gc_sym_list = sym; } +/* Check relocations. */ + +static void +lang_check_relocs (void) +{ + if (link_info.check_relocs_after_open_input + && bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour) + { + bfd *abfd; + + for (abfd = link_info.input_bfds; + abfd != (bfd *) NULL; abfd = abfd->link.next) + if (!_bfd_elf_link_check_relocs (abfd, &link_info)) + { + /* no object output, fail return */ + config.make_executable = FALSE; + break; + } + } +} + void lang_process (void) { @@ -6917,6 +6938,9 @@ lang_process (void) /* Remove unreferenced sections if asked to. */ lang_gc_sections (); + /* Check relocations. */ + lang_check_relocs (); + /* Update wild statements. */ update_wild_statements (statement_list.head); |