/* BFD back-end for HP PA-RISC ELF files.
- Copyright (C) 1990-2015 Free Software Foundation, Inc.
+ Copyright (C) 1990-2016 Free Software Foundation, Inc.
Original code by
Center for Software Science
/* Assorted information used by elf32_hppa_size_stubs. */
unsigned int bfd_count;
- int top_index;
+ unsigned int top_index;
asection **input_list;
Elf_Internal_Sym **all_local_syms;
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 *
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;
}
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);
if (htab->etab.dynamic_sections_created)
{
/* Set the contents of the .interp section to the interpreter. */
- if (bfd_link_executable (info))
+ if (bfd_link_executable (info) && !info->nointerp)
{
sec = bfd_get_linker_section (dynobj, ".interp");
if (sec == NULL)
{
bfd *input_bfd;
unsigned int bfd_count;
- int top_id, top_index;
+ unsigned int top_id, top_index;
asection *section;
asection **input_list, **list;
bfd_size_type amt;
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);
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;
static bfd_boolean
elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
{
+ struct stat buf;
+
/* Invoke the regular ELF linker to do all the work. */
if (!bfd_elf_final_link (abfd, info))
return FALSE;
if (bfd_link_relocatable (info))
return TRUE;
+ /* Do not attempt to sort non-regular files. This is here
+ especially for configure scripts and kernel builds which run
+ tests with "ld [...] -o /dev/null". */
+ if (stat (abfd->filename, &buf) != 0
+ || !S_ISREG(buf.st_mode))
+ return TRUE;
+
return elf_hppa_sort_unwind (abfd);
}
&& ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
&& eh->type == STT_PARISC_MILLI)
{
- if (! info->callbacks->undefined_symbol
- (info, eh_name (eh), input_bfd,
- input_section, rela->r_offset, FALSE))
- return FALSE;
+ (*info->callbacks->undefined_symbol)
+ (info, eh_name (eh), input_bfd,
+ input_section, rela->r_offset, FALSE);
warned_undef = TRUE;
}
}
}
}
else
- {
- if (!((*info->callbacks->reloc_overflow)
- (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
- (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
- return FALSE;
- }
+ (*info->callbacks->reloc_overflow)
+ (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
+ (bfd_vma) 0, input_bfd, input_section, rela->r_offset);
}
return TRUE;
if (htab->splt != NULL && htab->splt->size != 0)
{
- /* Set plt entry size. */
- elf_section_data (htab->splt->output_section)
- ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
+ /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the
+ plt stubs and as such the section does not hold a table of fixed-size
+ entries. */
+ elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize = 0;
if (htab->need_plt_stub)
{