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.
This commit is contained in:
parent
1a7272c0f9
commit
fbf05aa70d
@ -1,3 +1,10 @@
|
||||
2016-04-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2016-04-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/19972
|
||||
|
@ -1026,20 +1026,6 @@ gld${EMULATION_NAME}_after_open (void)
|
||||
if (!is_elf_hash_table (htab))
|
||||
return;
|
||||
|
||||
if (link_info.check_relocs_after_open_input)
|
||||
{
|
||||
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;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (emit_note_gnu_build_id != NULL)
|
||||
{
|
||||
bfd *abfd;
|
||||
|
24
ld/ldlang.c
24
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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user