aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-04-20 17:06:58 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-04-20 17:08:55 -0700
commitfbf05aa70d7a6ad3dd92ca718faa4bb383b975ee (patch)
tree97f3ad2521a068913cf8e0aaafea1747fecf4f0e /ld/ldlang.c
parent1a7272c0f9080ca18a724c91ab37a10fa45ad9e4 (diff)
downloadgdb-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.c24
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);