[HPPA] Attach linker created dynamic sections to stub bfd

bfd/
	* elf32-hppa.c (elf32_hppa_init_stub_bfd): New function.
	(elf32_hppa_check_relocs): Don't set dynobj.
	(elf32_hppa_size_stubs): Test !SEC_LINKER_CREATED for stub sections.
	(elf32_hppa_build_stubs): Likewise.
	* elf32-hppa.h (elf32_hppa_init_stub_bfd): Declare.
ld/
	* emultempl/hppaelf.em (hppaelf_create_output_section_statements):
	Call elf32_hppa_init_stub_bfd.
This commit is contained in:
Alan Modra 2016-05-11 22:51:14 +09:30
parent 3bd43ebcb6
commit a464198b01
5 changed files with 40 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2016-05-11 Alan Modra <amodra@gmail.com>
* elf32-hppa.c (elf32_hppa_init_stub_bfd): New function.
(elf32_hppa_check_relocs): Don't set dynobj.
(elf32_hppa_size_stubs): Test !SEC_LINKER_CREATED for stub sections.
(elf32_hppa_build_stubs): Likewise.
* elf32-hppa.h (elf32_hppa_init_stub_bfd): Declare.
2016-05-11 Alan Modra <amodra@gmail.com>
PR 20060

View File

@ -455,6 +455,18 @@ elf32_hppa_link_hash_table_create (bfd *abfd)
return &htab->etab.root;
}
/* Initialize the linker stubs BFD so that we can use it for linker
created dynamic sections. */
void
elf32_hppa_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
{
struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS32;
htab->etab.dynobj = abfd;
}
/* Build a name for an entry in the stub hash table. */
static char *
@ -1347,8 +1359,6 @@ elf32_hppa_check_relocs (bfd *abfd,
relocation for this entry. */
if (htab->sgot == NULL)
{
if (htab->etab.dynobj == NULL)
htab->etab.dynobj = abfd;
if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
return FALSE;
}
@ -1484,9 +1494,6 @@ elf32_hppa_check_relocs (bfd *abfd,
this reloc. */
if (sreloc == NULL)
{
if (htab->etab.dynobj == NULL)
htab->etab.dynobj = abfd;
sreloc = _bfd_elf_make_dynamic_reloc_section
(sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
@ -3071,7 +3078,8 @@ elf32_hppa_size_stubs
for (stub_sec = htab->stub_bfd->sections;
stub_sec != NULL;
stub_sec = stub_sec->next)
stub_sec->size = 0;
if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
stub_sec->size = 0;
bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
@ -3193,16 +3201,15 @@ elf32_hppa_build_stubs (struct bfd_link_info *info)
for (stub_sec = htab->stub_bfd->sections;
stub_sec != NULL;
stub_sec = stub_sec->next)
{
bfd_size_type size;
/* Allocate memory to hold the linker stubs. */
size = stub_sec->size;
stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
if (stub_sec->contents == NULL && size != 0)
return FALSE;
stub_sec->size = 0;
}
if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
&& stub_sec->size != 0)
{
/* Allocate memory to hold the linker stubs. */
stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
if (stub_sec->contents == NULL)
return FALSE;
stub_sec->size = 0;
}
/* Build the stubs as directed by the stub hash table. */
table = &htab->bstab;

View File

@ -36,6 +36,9 @@
#include "libhppa.h"
#include "elf/hppa.h"
void elf32_hppa_init_stub_bfd
(bfd *, struct bfd_link_info *);
int elf32_hppa_setup_section_lists
(bfd *, struct bfd_link_info *);

View File

@ -1,3 +1,8 @@
2016-05-11 Alan Modra <amodra@gmail.com>
* emultempl/hppaelf.em (hppaelf_create_output_section_statements):
Call elf32_hppa_init_stub_bfd.
2016-05-11 Alan Modra <amodra@gmail.com>
PR 20060

View File

@ -88,6 +88,7 @@ hppaelf_create_output_section_statements (void)
stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
ldlang_add_file (stub_file);
elf32_hppa_init_stub_bfd (stub_file->the_bfd, &link_info);
}