summaryrefslogtreecommitdiff
path: root/bfd/elf64-sparc.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2005-01-09 19:48:28 +0000
committerEric Botcazou <ebotcazou@libertysurf.fr>2005-01-09 19:48:28 +0000
commit50030a8f934cdc333cc375efc5e2cf06352ac2c4 (patch)
tree8b92ff399a1a8f237b8a4e49b15f10f76eb933e1 /bfd/elf64-sparc.c
parent666b4fad5b77d16f7b779bcbc10997f82ce1957d (diff)
downloadbinutils-redhat-50030a8f934cdc333cc375efc5e2cf06352ac2c4.tar.gz
* elf64-sparc.c (struct sparc64_elf_link_hash_table): New 'sgot' and
'srelgot' fields. (create_got_section): New function. (sparc64_elf_create_dynamic_sections): Likewise. (sparc64_elf_check_relocs): Invoke create_got_section instead of _bfd_elf_create_got_section. Use the sgot and srelgot shortcuts. (sparc64_elf_size_dynamic_sections): Use the srelgot shortcut. (sparc64_elf_relocate_section): Use the sgot and srelgot shortcuts. (sparc64_elf_finish_dynamic_symbol): Likewise. (sparc64_elf_finish_dynamic_sections): Use the sgot shortcut. (elf_backend_create_dynamic_sections): Define to sparc64_elf_create_dynamic_sections.
Diffstat (limited to 'bfd/elf64-sparc.c')
-rw-r--r--bfd/elf64-sparc.c96
1 files changed, 71 insertions, 25 deletions
diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c
index c7c9c4dd97..62fb524e58 100644
--- a/bfd/elf64-sparc.c
+++ b/bfd/elf64-sparc.c
@@ -36,6 +36,10 @@
static struct bfd_link_hash_table * sparc64_elf_bfd_link_hash_table_create
PARAMS ((bfd *));
+static bfd_boolean create_got_section
+ PARAMS ((bfd *, struct bfd_link_info *));
+static bfd_boolean sparc64_elf_create_dynamic_sections
+ PARAMS ((bfd *, struct bfd_link_info *));
static bfd_reloc_status_type init_insn_reloc
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *,
bfd *, bfd_vma *, bfd_vma *));
@@ -738,6 +742,10 @@ struct sparc64_elf_link_hash_table
{
struct elf_link_hash_table root;
+ /* Short-cuts to get to dynamic linker sections. */
+ asection *sgot;
+ asection *srelgot;
+
struct sparc64_elf_app_reg app_regs [4];
};
@@ -768,6 +776,57 @@ sparc64_elf_bfd_link_hash_table_create (abfd)
return &ret->root.root;
}
+
+/* Create .got and .rela.got sections in DYNOBJ and set up
+ shortcuts to them in our hash table. */
+
+static bfd_boolean
+create_got_section (dynobj, info)
+ bfd *dynobj;
+ struct bfd_link_info *info;
+{
+ struct sparc64_elf_link_hash_table *htab;
+
+ if (! _bfd_elf_create_got_section (dynobj, info))
+ return FALSE;
+
+ htab = sparc64_elf_hash_table (info);
+ htab->sgot = bfd_get_section_by_name (dynobj, ".got");
+ BFD_ASSERT (htab->sgot != NULL);
+
+ htab->srelgot = bfd_make_section (dynobj, ".rela.got");
+ if (htab->srelgot == NULL
+ || ! bfd_set_section_flags (dynobj, htab->srelgot, SEC_ALLOC
+ | SEC_LOAD
+ | SEC_HAS_CONTENTS
+ | SEC_IN_MEMORY
+ | SEC_LINKER_CREATED
+ | SEC_READONLY)
+ || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
+ return FALSE;
+ return TRUE;
+}
+
+/* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
+ .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
+ hash table. */
+
+static bfd_boolean
+sparc64_elf_create_dynamic_sections (dynobj, info)
+ bfd *dynobj;
+ struct bfd_link_info *info;
+{
+ struct sparc64_elf_link_hash_table *htab;
+
+ htab = sparc64_elf_hash_table (info);
+ if (!htab->sgot && !create_got_section (dynobj, info))
+ return FALSE;
+
+ if (!_bfd_elf_create_dynamic_sections (dynobj, info))
+ return FALSE;
+
+ return TRUE;
+}
/* Utility for performing the standard initial work of an instruction
relocation.
@@ -1137,35 +1196,22 @@ sparc64_elf_check_relocs (abfd, info, sec, relocs)
if (dynobj == NULL)
{
- /* Create the .got section. */
+ /* Create the .got and .rela.got sections. */
elf_hash_table (info)->dynobj = dynobj = abfd;
- if (! _bfd_elf_create_got_section (dynobj, info))
+ if (! create_got_section (dynobj, info))
return FALSE;
}
if (sgot == NULL)
{
- sgot = bfd_get_section_by_name (dynobj, ".got");
+ sgot = sparc64_elf_hash_table (info)->sgot;
BFD_ASSERT (sgot != NULL);
}
if (srelgot == NULL && (h != NULL || info->shared))
{
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
- if (srelgot == NULL)
- {
- srelgot = bfd_make_section (dynobj, ".rela.got");
- if (srelgot == NULL
- || ! bfd_set_section_flags (dynobj, srelgot,
- (SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY))
- || ! bfd_set_section_alignment (dynobj, srelgot, 3))
- return FALSE;
- }
+ srelgot = sparc64_elf_hash_table (info)->srelgot;
+ BFD_ASSERT (srelgot != NULL);
}
if (h != NULL)
@@ -1811,7 +1857,7 @@ sparc64_elf_size_dynamic_sections (output_bfd, info)
not actually use these entries. Reset the size of .rela.got,
which will cause it to get stripped from the output file
below. */
- s = bfd_get_section_by_name (dynobj, ".rela.got");
+ s = sparc64_elf_hash_table (info)->srelgot;
if (s != NULL)
s->size = 0;
}
@@ -2324,7 +2370,7 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
offset table. */
if (sgot == NULL)
{
- sgot = bfd_get_section_by_name (dynobj, ".got");
+ sgot = sparc64_elf_hash_table (info)->sgot;
BFD_ASSERT (sgot != NULL);
}
@@ -2398,7 +2444,7 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
/* We need to generate a R_SPARC_RELATIVE reloc
for the dynamic linker. */
- s = bfd_get_section_by_name(dynobj, ".rela.got");
+ s = sparc64_elf_hash_table (info)->srelgot;
BFD_ASSERT (s != NULL);
outrel.r_offset = (sgot->output_section->vma
@@ -2779,8 +2825,8 @@ sparc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
/* This symbol has an entry in the GOT. Set it up. */
- sgot = bfd_get_section_by_name (dynobj, ".got");
- srela = bfd_get_section_by_name (dynobj, ".rela.got");
+ sgot = sparc64_elf_hash_table (info)->sgot;
+ srela = sparc64_elf_hash_table (info)->srelgot;
BFD_ASSERT (sgot != NULL && srela != NULL);
rela.r_offset = (sgot->output_section->vma
@@ -2928,7 +2974,7 @@ sparc64_elf_finish_dynamic_sections (output_bfd, info)
/* Set the first entry in the global offset table to the address of
the dynamic section. */
- sgot = bfd_get_section_by_name (dynobj, ".got");
+ sgot = sparc64_elf_hash_table (info)->sgot;
BFD_ASSERT (sgot != NULL);
if (sgot->size > 0)
{
@@ -3206,7 +3252,7 @@ const struct elf_size_info sparc64_elf_size_info =
sparc64_elf_new_section_hook
#define elf_backend_create_dynamic_sections \
- _bfd_elf_create_dynamic_sections
+ sparc64_elf_create_dynamic_sections
#define elf_backend_add_symbol_hook \
sparc64_elf_add_symbol_hook
#define elf_backend_get_symbol_type \