Index: bfd/elf32-cris.c |
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c |
index 563e2c075e6ba43d326ffc0760944cc0c6c402a6..c9316ee1958ee7cc35784f128be62f24b6477faf 100644 |
--- a/bfd/elf32-cris.c |
+++ b/bfd/elf32-cris.c |
@@ -1,6 +1,6 @@ |
/* CRIS-specific support for 32-bit ELF. |
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, |
- 2010, 2011 Free Software Foundation, Inc. |
+ 2010, 2011, 2012 Free Software Foundation, Inc. |
Contributed by Axis Communications AB. |
Written by Hans-Peter Nilsson, based on elf32-fr30.c |
PIC and shlib bits based primarily on elf32-m68k.c and elf32-i386.c. |
@@ -29,73 +29,13 @@ |
#include "elf/cris.h" |
#include <limits.h> |
-/* Forward declarations. */ |
-static reloc_howto_type * cris_reloc_type_lookup |
- PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); |
- |
-static void cris_info_to_howto_rela |
- PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); |
- |
-static bfd_reloc_status_type cris_elf_pcrel_reloc |
- PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); |
- |
-static bfd_boolean cris_elf_grok_prstatus |
- PARAMS ((bfd *abfd, Elf_Internal_Note *note)); |
- |
-static bfd_boolean cris_elf_grok_psinfo |
- PARAMS ((bfd *abfd, Elf_Internal_Note *note)); |
- |
-static bfd_boolean cris_elf_relocate_section |
- PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, |
- Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); |
- |
-static bfd_reloc_status_type cris_final_link_relocate |
- PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, |
- Elf_Internal_Rela *, bfd_vma)); |
- |
-static bfd_boolean cris_elf_object_p PARAMS ((bfd *)); |
- |
-static void cris_elf_final_write_processing PARAMS ((bfd *, bfd_boolean)); |
- |
-static bfd_boolean cris_elf_set_mach_from_flags |
- PARAMS ((bfd *, unsigned long int)); |
- |
-static bfd_boolean cris_elf_print_private_bfd_data PARAMS ((bfd *, PTR)); |
- |
-static bfd_boolean cris_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *)); |
-static bfd_boolean cris_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *)); |
- |
-struct elf_cris_link_hash_entry; |
-static bfd_boolean elf_cris_discard_excess_dso_dynamics |
- PARAMS ((struct elf_cris_link_hash_entry *, PTR)); |
-static bfd_boolean elf_cris_discard_excess_program_dynamics |
- PARAMS ((struct elf_cris_link_hash_entry *, PTR)); |
-static bfd_boolean elf_cris_adjust_gotplt_to_got |
- PARAMS ((struct elf_cris_link_hash_entry *, PTR)); |
-static bfd_boolean elf_cris_try_fold_plt_to_got |
- PARAMS ((struct elf_cris_link_hash_entry *, PTR)); |
-static struct bfd_hash_entry *elf_cris_link_hash_newfunc |
- PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); |
-static struct bfd_link_hash_table *elf_cris_link_hash_table_create |
- PARAMS ((bfd *)); |
-static bfd_boolean elf_cris_adjust_dynamic_symbol |
- PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); |
-static bfd_boolean cris_elf_check_relocs |
- PARAMS ((bfd *, struct bfd_link_info *, asection *, |
- const Elf_Internal_Rela *)); |
- |
-static bfd_boolean elf_cris_size_dynamic_sections |
- PARAMS ((bfd *, struct bfd_link_info *)); |
-static bfd_boolean elf_cris_finish_dynamic_symbol |
- PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, |
- Elf_Internal_Sym *)); |
-static bfd_boolean elf_cris_finish_dynamic_sections |
- PARAMS ((bfd *, struct bfd_link_info *)); |
-static void elf_cris_hide_symbol |
- PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean)); |
-static enum elf_reloc_type_class elf_cris_reloc_type_class |
- PARAMS ((const Elf_Internal_Rela *)); |
+bfd_reloc_status_type |
+cris_elf_pcrel_reloc (bfd *, arelent *, asymbol *, void *, |
+ asection *, bfd *, char **); |
+static bfd_boolean |
+cris_elf_set_mach_from_flags (bfd *, unsigned long); |
+/* Forward declarations. */ |
static reloc_howto_type cris_elf_howto_table [] = |
{ |
/* This reloc does nothing. */ |
@@ -485,9 +425,8 @@ static const struct cris_reloc_map cris_reloc_map [] = |
}; |
static reloc_howto_type * |
-cris_reloc_type_lookup (abfd, code) |
- bfd * abfd ATTRIBUTE_UNUSED; |
- bfd_reloc_code_real_type code; |
+cris_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
+ bfd_reloc_code_real_type code) |
{ |
unsigned int i; |
@@ -516,10 +455,9 @@ cris_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name) |
/* Set the howto pointer for an CRIS ELF reloc. */ |
static void |
-cris_info_to_howto_rela (abfd, cache_ptr, dst) |
- bfd * abfd ATTRIBUTE_UNUSED; |
- arelent * cache_ptr; |
- Elf_Internal_Rela * dst; |
+cris_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, |
+ arelent * cache_ptr, |
+ Elf_Internal_Rela * dst) |
{ |
enum elf_cris_reloc_type r_type; |
@@ -529,15 +467,13 @@ cris_info_to_howto_rela (abfd, cache_ptr, dst) |
} |
bfd_reloc_status_type |
-cris_elf_pcrel_reloc (abfd, reloc_entry, symbol, data, input_section, |
- output_bfd, error_message) |
- bfd *abfd ATTRIBUTE_UNUSED; |
- arelent *reloc_entry; |
- asymbol *symbol; |
- PTR data ATTRIBUTE_UNUSED; |
- asection *input_section; |
- bfd *output_bfd; |
- char **error_message ATTRIBUTE_UNUSED; |
+cris_elf_pcrel_reloc (bfd *abfd ATTRIBUTE_UNUSED, |
+ arelent *reloc_entry, |
+ asymbol *symbol, |
+ void * data ATTRIBUTE_UNUSED, |
+ asection *input_section, |
+ bfd *output_bfd, |
+ char **error_message ATTRIBUTE_UNUSED) |
{ |
/* By default (using only bfd_elf_generic_reloc when linking to |
non-ELF formats) PC-relative relocs are relative to the beginning |
@@ -562,9 +498,7 @@ cris_elf_pcrel_reloc (abfd, reloc_entry, symbol, data, input_section, |
changes, while still keeping Linux/CRIS and Linux/CRISv32 code apart. */ |
static bfd_boolean |
-cris_elf_grok_prstatus (abfd, note) |
- bfd *abfd; |
- Elf_Internal_Note *note; |
+cris_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) |
{ |
int offset; |
size_t size; |
@@ -614,9 +548,7 @@ cris_elf_grok_prstatus (abfd, note) |
} |
static bfd_boolean |
-cris_elf_grok_psinfo (abfd, note) |
- bfd *abfd; |
- Elf_Internal_Note *note; |
+cris_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
{ |
if (bfd_get_mach (abfd) == bfd_mach_cris_v32) |
switch (note->descsz) |
@@ -848,6 +780,13 @@ struct elf_cris_link_hash_entry |
bfd_signed_vma dtp_refcount; |
}; |
+static bfd_boolean |
+elf_cris_discard_excess_dso_dynamics (struct elf_cris_link_hash_entry *, |
+ void * ); |
+static bfd_boolean |
+elf_cris_discard_excess_program_dynamics (struct elf_cris_link_hash_entry *, |
+ void *); |
+ |
/* The local_got_refcounts and local_got_offsets are a multiple of |
LSNUM in size, namely LGOT_ALLOC_NELTS_FOR(LSNUM) (plus one for the |
refcount for GOT itself, see code), with the summary / group offset |
@@ -972,14 +911,12 @@ elf_cris_link_hash_table_create (bfd *abfd) |
routines, with a few tweaks. */ |
static bfd_reloc_status_type |
-cris_final_link_relocate (howto, input_bfd, input_section, contents, rel, |
- relocation) |
- reloc_howto_type * howto; |
- bfd * input_bfd; |
- asection * input_section; |
- bfd_byte * contents; |
- Elf_Internal_Rela * rel; |
- bfd_vma relocation; |
+cris_final_link_relocate (reloc_howto_type * howto, |
+ bfd * input_bfd, |
+ asection * input_section, |
+ bfd_byte * contents, |
+ Elf_Internal_Rela * rel, |
+ bfd_vma relocation) |
{ |
bfd_reloc_status_type r; |
enum elf_cris_reloc_type r_type = ELF32_R_TYPE (rel->r_info); |
@@ -1065,8 +1002,8 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (dynobj != NULL) |
{ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
} |
for (rel = relocs; rel < relend; rel ++) |
@@ -1184,9 +1121,9 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
} |
} |
- if (sec != NULL && elf_discarded_section (sec)) |
+ if (sec != NULL && discarded_section (sec)) |
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, |
- rel, relend, howto, contents); |
+ rel, 1, relend, howto, 0, contents); |
if (info->relocatable) |
continue; |
@@ -1204,7 +1141,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
&& ((struct elf_cris_link_hash_entry *) h)->gotplt_offset != 0) |
{ |
asection *sgotplt |
- = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ = bfd_get_linker_section (dynobj, ".got.plt"); |
bfd_vma got_offset; |
BFD_ASSERT (h->dynindx != -1); |
@@ -1336,7 +1273,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (srelgot == NULL) |
srelgot |
- = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
outrel.r_offset = (sgot->output_section->vma |
@@ -1652,7 +1589,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (htab->dtpmod_refcount > 0 |
&& (input_section->flags & SEC_ALLOC) != 0) |
{ |
- asection *sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ asection *sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (sgotplt != NULL); |
if (info->shared) |
@@ -1661,7 +1598,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
bfd_byte *loc; |
if (srelgot == NULL) |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
loc = srelgot->contents; |
loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); |
@@ -1805,7 +1742,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
bfd_put_32 (output_bfd, 0, sgot->contents + off + 4); |
if (srelgot == NULL) |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
if (h != NULL && h->dynindx != -1) |
@@ -1877,7 +1814,8 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
return FALSE; |
} |
- if (!info->shared && (h == NULL || h->def_regular)) |
+ if (!info->shared |
+ && (h == NULL || h->def_regular || ELF_COMMON_DEF_P (h))) |
{ |
/* Known contents of the GOT. */ |
bfd_vma off; |
@@ -1936,7 +1874,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
local_got_offsets[r_symndx] |= 1; |
if (srelgot == NULL) |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
if (h != NULL && h->dynindx != -1) |
@@ -2192,9 +2130,9 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd, |
BFD_ASSERT (h->dynindx != -1); |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); |
- srela = bfd_get_section_by_name (dynobj, ".rela.plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); |
+ srela = bfd_get_linker_section (dynobj, ".rela.plt"); |
BFD_ASSERT (splt != NULL && sgotplt != NULL |
&& (! has_gotplt || srela != NULL)); |
@@ -2291,8 +2229,8 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd, |
/* This symbol has an entry in the global offset table. Set it up. */ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srela = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srela = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (sgot != NULL && srela != NULL); |
rela.r_offset = (sgot->output_section->vma |
@@ -2337,8 +2275,7 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd, |
&& (h->root.type == bfd_link_hash_defined |
|| h->root.type == bfd_link_hash_defweak)); |
- s = bfd_get_section_by_name (h->root.u.def.section->owner, |
- ".rela.bss"); |
+ s = bfd_get_linker_section (dynobj, ".rela.bss"); |
BFD_ASSERT (s != NULL); |
rela.r_offset = (h->root.u.def.value |
@@ -2363,9 +2300,8 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd, |
computed. */ |
static bfd_boolean |
-elf_cris_finish_dynamic_sections (output_bfd, info) |
- bfd *output_bfd; |
- struct bfd_link_info *info; |
+elf_cris_finish_dynamic_sections (bfd *output_bfd, |
+ struct bfd_link_info *info) |
{ |
bfd *dynobj; |
asection *sgot; |
@@ -2373,16 +2309,16 @@ elf_cris_finish_dynamic_sections (output_bfd, info) |
dynobj = elf_hash_table (info)->dynobj; |
- sgot = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (sgot != NULL); |
- sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); |
+ sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
if (elf_hash_table (info)->dynamic_sections_created) |
{ |
asection *splt; |
Elf32_External_Dyn *dyncon, *dynconend; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (splt != NULL && sdyn != NULL); |
dyncon = (Elf32_External_Dyn *) sdyn->contents; |
@@ -2560,8 +2496,8 @@ cris_elf_gc_sweep_hook (bfd *abfd, |
sym_hashes = elf_sym_hashes (abfd); |
local_got_refcounts = elf_local_got_refcounts (abfd); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
relend = relocs + sec->reloc_count; |
for (rel = relocs; rel < relend; rel++) |
@@ -2718,16 +2654,64 @@ cris_elf_gc_sweep_hook (bfd *abfd, |
/* The elf_backend_plt_sym_val hook function. */ |
static bfd_vma |
-cris_elf_plt_sym_val (bfd_vma i, const asection *plt, |
- const arelent *rel ATTRIBUTE_UNUSED) |
+cris_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED, const asection *plt, |
+ const arelent *rel) |
{ |
bfd_size_type plt_entry_size; |
+ bfd_size_type pltoffs; |
+ bfd *abfd = plt->owner; |
+ /* Same for CRIS and CRIS v32; see elf_cris_(|pic_)plt_entry(|_v32)[]. */ |
+ bfd_size_type plt_entry_got_offset = 2; |
+ bfd_size_type plt_sec_size; |
+ bfd_size_type got_vma_for_dyn; |
+ asection *got; |
+ |
+ /* FIXME: the .got section should be readily available also when |
+ we're not linking. */ |
+ if ((got = bfd_get_section_by_name (abfd, ".got")) == NULL) |
+ return (bfd_vma) -1; |
+ |
+ plt_sec_size = bfd_section_size (plt->owner, plt); |
plt_entry_size |
- = (bfd_get_mach (plt->owner) == bfd_mach_cris_v32 |
+ = (bfd_get_mach (abfd) == bfd_mach_cris_v32 |
? PLT_ENTRY_SIZE_V32 : PLT_ENTRY_SIZE); |
- return plt->vma + (i + 1) * plt_entry_size; |
+ /* Data in PLT is GOT-relative for DYN, but absolute for EXE. */ |
+ got_vma_for_dyn = (abfd->flags & EXEC_P) ? 0 : got->vma; |
+ |
+ /* Because we can have merged GOT entries; a single .got entry for |
+ both GOT and the PLT part of the GOT (.got.plt), the index of the |
+ reloc in .rela.plt is not the same as the index in the PLT. |
+ Instead, we have to hunt down the GOT offset in the PLT that |
+ corresponds to that of this reloc. Unfortunately, we will only |
+ be called for the .rela.plt relocs, so we'll miss synthetic |
+ symbols for .plt entries with merged GOT entries. (FIXME: |
+ fixable by providing our own bfd_elf32_get_synthetic_symtab. |
+ Doesn't seem worthwile at time of this writing.) FIXME: we've |
+ gone from O(1) to O(N) (N number of PLT entries) for finding each |
+ PLT address. Shouldn't matter in practice though. */ |
+ |
+ for (pltoffs = plt_entry_size; |
+ pltoffs < plt_sec_size; |
+ pltoffs += plt_entry_size) |
+ { |
+ bfd_size_type got_offset; |
+ bfd_byte gotoffs_raw[4]; |
+ |
+ if (!bfd_get_section_contents (abfd, (asection *) plt, gotoffs_raw, |
+ pltoffs + plt_entry_got_offset, |
+ sizeof (gotoffs_raw))) |
+ return (bfd_vma) -1; |
+ |
+ got_offset = bfd_get_32 (abfd, gotoffs_raw); |
+ if (got_offset + got_vma_for_dyn == rel->address) |
+ return plt->vma + pltoffs; |
+ } |
+ |
+ /* While it's tempting to BFD_ASSERT that we shouldn't get here, |
+ that'd not be graceful behavior for invalid input. */ |
+ return (bfd_vma) -1; |
} |
/* Make sure we emit a GOT entry if the symbol was supposed to have a PLT |
@@ -2738,9 +2722,7 @@ cris_elf_plt_sym_val (bfd_vma i, const asection *plt, |
created (we're only linking static objects). */ |
static bfd_boolean |
-elf_cris_adjust_gotplt_to_got (h, p) |
- struct elf_cris_link_hash_entry *h; |
- PTR p; |
+elf_cris_adjust_gotplt_to_got (struct elf_cris_link_hash_entry *h, void * p) |
{ |
struct bfd_link_info *info = (struct bfd_link_info *) p; |
@@ -2770,8 +2752,8 @@ elf_cris_adjust_gotplt_to_got (h, p) |
asection *srelgot; |
BFD_ASSERT (dynobj != NULL); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
/* Put accurate refcounts there. */ |
h->root.got.refcount += h->gotplt_refcount; |
@@ -2818,9 +2800,7 @@ elf_cris_adjust_gotplt_to_got (h, p) |
elf_cris_hide_symbol. */ |
static bfd_boolean |
-elf_cris_try_fold_plt_to_got (h, p) |
- struct elf_cris_link_hash_entry *h; |
- PTR p; |
+elf_cris_try_fold_plt_to_got (struct elf_cris_link_hash_entry *h, void * p) |
{ |
struct bfd_link_info *info = (struct bfd_link_info *) p; |
@@ -2852,10 +2832,9 @@ elf_cris_try_fold_plt_to_got (h, p) |
entry. */ |
static void |
-elf_cris_hide_symbol (info, h, force_local) |
- struct bfd_link_info *info; |
- struct elf_link_hash_entry *h; |
- bfd_boolean force_local; |
+elf_cris_hide_symbol (struct bfd_link_info *info, |
+ struct elf_link_hash_entry *h, |
+ bfd_boolean force_local) |
{ |
elf_cris_adjust_gotplt_to_got ((struct elf_cris_link_hash_entry *) h, info); |
@@ -2949,7 +2928,7 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info, |
return FALSE; |
} |
- s = bfd_get_section_by_name (dynobj, ".plt"); |
+ s = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (s != NULL); |
/* If this is the first .plt entry, make room for the special |
@@ -3008,13 +2987,13 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info, |
= htab->next_gotplt_entry; |
htab->next_gotplt_entry += 4; |
- s = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ s = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (s != NULL); |
s->size += 4; |
/* We also need to make an entry in the .rela.plt section. */ |
- s = bfd_get_section_by_name (dynobj, ".rela.plt"); |
+ s = bfd_get_linker_section (dynobj, ".rela.plt"); |
BFD_ASSERT (s != NULL); |
s->size += sizeof (Elf32_External_Rela); |
@@ -3052,13 +3031,6 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info, |
if (!h->non_got_ref) |
return TRUE; |
- if (h->size == 0) |
- { |
- (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), |
- h->root.root.string); |
- return TRUE; |
- } |
- |
/* We must allocate the symbol in our .dynbss section, which will |
become part of the .bss section of the executable. There will be |
an entry for this symbol in the .dynsym section. The dynamic |
@@ -3069,18 +3041,18 @@ elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info, |
both the dynamic object and the regular object will refer to the |
same memory location for the variable. */ |
- s = bfd_get_section_by_name (dynobj, ".dynbss"); |
+ s = bfd_get_linker_section (dynobj, ".dynbss"); |
BFD_ASSERT (s != NULL); |
/* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to |
copy the initial value out of the dynamic object and into the |
runtime process image. We need to remember the offset into the |
.rela.bss section we are going to use. */ |
- if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) |
+ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) |
{ |
asection *srel; |
- srel = bfd_get_section_by_name (dynobj, ".rela.bss"); |
+ srel = bfd_get_linker_section (dynobj, ".rela.bss"); |
BFD_ASSERT (srel != NULL); |
srel->size += sizeof (Elf32_External_Rela); |
h->needs_copy = 1; |
@@ -3271,7 +3243,7 @@ cris_elf_check_relocs (bfd *abfd, |
} |
if (sgot == NULL) |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
if (local_got_refcounts == NULL) |
{ |
@@ -3331,17 +3303,15 @@ cris_elf_check_relocs (bfd *abfd, |
if (srelgot == NULL |
&& (h != NULL || info->shared)) |
{ |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
if (srelgot == NULL) |
{ |
- srelgot = bfd_make_section_with_flags (dynobj, |
- ".rela.got", |
- (SEC_ALLOC |
- | SEC_LOAD |
- | SEC_HAS_CONTENTS |
- | SEC_IN_MEMORY |
- | SEC_LINKER_CREATED |
- | SEC_READONLY)); |
+ flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS |
+ | SEC_IN_MEMORY | SEC_LINKER_CREATED |
+ | SEC_READONLY); |
+ srelgot = bfd_make_section_anyway_with_flags (dynobj, |
+ ".rela.got", |
+ flags); |
if (srelgot == NULL |
|| !bfd_set_section_alignment (dynobj, srelgot, 2)) |
return FALSE; |
@@ -3787,7 +3757,7 @@ elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
/* Set the contents of the .interp section to the interpreter. */ |
if (info->executable) |
{ |
- s = bfd_get_section_by_name (dynobj, ".interp"); |
+ s = bfd_get_linker_section (dynobj, ".interp"); |
BFD_ASSERT (s != NULL); |
s->size = sizeof ELF_DYNAMIC_INTERPRETER; |
s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; |
@@ -3804,7 +3774,7 @@ elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
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 = bfd_get_linker_section (dynobj, ".rela.got"); |
if (s != NULL) |
s->size = 0; |
} |
@@ -3963,9 +3933,8 @@ elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
relocate_section routine. */ |
static bfd_boolean |
-elf_cris_discard_excess_dso_dynamics (h, inf) |
- struct elf_cris_link_hash_entry *h; |
- PTR inf; |
+elf_cris_discard_excess_dso_dynamics (struct elf_cris_link_hash_entry *h, |
+ void * inf) |
{ |
struct elf_cris_pcrel_relocs_copied *s; |
struct bfd_link_info *info = (struct bfd_link_info *) inf; |
@@ -4019,9 +3988,8 @@ elf_cris_discard_excess_dso_dynamics (h, inf) |
in the .got, but which we found we do not have to resolve at run-time. */ |
static bfd_boolean |
-elf_cris_discard_excess_program_dynamics (h, inf) |
- struct elf_cris_link_hash_entry *h; |
- PTR inf; |
+elf_cris_discard_excess_program_dynamics (struct elf_cris_link_hash_entry *h, |
+ void * inf) |
{ |
struct bfd_link_info *info = (struct bfd_link_info *) inf; |
@@ -4044,7 +4012,7 @@ elf_cris_discard_excess_program_dynamics (h, inf) |
BFD_ASSERT (dynobj != NULL); |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
@@ -4074,8 +4042,7 @@ elf_cris_discard_excess_program_dynamics (h, inf) |
underscores on symbols. */ |
static bfd_boolean |
-cris_elf_object_p (abfd) |
- bfd *abfd; |
+cris_elf_object_p (bfd *abfd) |
{ |
if (! cris_elf_set_mach_from_flags (abfd, elf_elfheader (abfd)->e_flags)) |
return FALSE; |
@@ -4090,9 +4057,8 @@ cris_elf_object_p (abfd) |
flags from mach type. */ |
static void |
-cris_elf_final_write_processing (abfd, linker) |
- bfd *abfd; |
- bfd_boolean linker ATTRIBUTE_UNUSED; |
+cris_elf_final_write_processing (bfd *abfd, |
+ bfd_boolean linker ATTRIBUTE_UNUSED) |
{ |
unsigned long e_flags = elf_elfheader (abfd)->e_flags; |
@@ -4125,9 +4091,8 @@ cris_elf_final_write_processing (abfd, linker) |
/* Set the mach type from e_flags value. */ |
static bfd_boolean |
-cris_elf_set_mach_from_flags (abfd, flags) |
- bfd *abfd; |
- unsigned long flags; |
+cris_elf_set_mach_from_flags (bfd *abfd, |
+ unsigned long flags) |
{ |
switch (flags & EF_CRIS_VARIANT_MASK) |
{ |
@@ -4157,9 +4122,7 @@ cris_elf_set_mach_from_flags (abfd, flags) |
/* Display the flags field. */ |
static bfd_boolean |
-cris_elf_print_private_bfd_data (abfd, ptr) |
- bfd *abfd; |
- PTR ptr; |
+cris_elf_print_private_bfd_data (bfd *abfd, void * ptr) |
{ |
FILE *file = (FILE *) ptr; |
@@ -4185,9 +4148,7 @@ cris_elf_print_private_bfd_data (abfd, ptr) |
/* Don't mix files with and without a leading underscore. */ |
static bfd_boolean |
-cris_elf_merge_private_bfd_data (ibfd, obfd) |
- bfd *ibfd; |
- bfd *obfd; |
+cris_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) |
{ |
int imach, omach; |
@@ -4264,9 +4225,7 @@ cris_elf_merge_private_bfd_data (ibfd, obfd) |
/* Do side-effects of e_flags copying to obfd. */ |
static bfd_boolean |
-cris_elf_copy_private_bfd_data (ibfd, obfd) |
- bfd *ibfd; |
- bfd *obfd; |
+cris_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd) |
{ |
/* Call the base function. */ |
if (!_bfd_elf_copy_private_bfd_data (ibfd, obfd)) |
@@ -4285,8 +4244,7 @@ cris_elf_copy_private_bfd_data (ibfd, obfd) |
} |
static enum elf_reloc_type_class |
-elf_cris_reloc_type_class (rela) |
- const Elf_Internal_Rela *rela; |
+elf_cris_reloc_type_class (const Elf_Internal_Rela *rela) |
{ |
enum elf_cris_reloc_type r_type = ELF32_R_TYPE (rela->r_info); |
switch (r_type) |