Index: bfd/elf64-sh64.c |
diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c |
index 920247726763975d5bebcaf9b07686a0bae35841..ce5436d0d948668ba489b96753db55e515cb376e 100644 |
--- a/bfd/elf64-sh64.c |
+++ b/bfd/elf64-sh64.c |
@@ -1,6 +1,6 @@ |
/* SuperH SH64-specific support for 64-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. |
This file is part of BFD, the Binary File Descriptor library. |
@@ -1514,7 +1514,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
_("Unexpected STO_SH5_ISA32 on local symbol is not handled"), |
input_bfd, input_section, rel->r_offset)); |
- if (sec != NULL && elf_discarded_section (sec)) |
+ if (sec != NULL && discarded_section (sec)) |
/* Handled below. */ |
; |
else if (info->relocatable) |
@@ -1661,9 +1661,9 @@ sh_elf64_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; |
@@ -1797,7 +1797,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
offset table extension for the procedure linkage table. */ |
if (sgotplt == NULL) |
{ |
- sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (sgotplt != NULL); |
} |
@@ -1820,7 +1820,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
offset table. */ |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
@@ -1914,7 +1914,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
Elf_Internal_Rela outrel; |
bfd_byte *loc; |
- s = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ s = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (s != NULL); |
outrel.r_offset = (sgot->output_section->vma |
@@ -1949,7 +1949,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
@@ -1974,7 +1974,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
@@ -2012,7 +2012,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
if (splt == NULL) |
{ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (splt != NULL); |
} |
@@ -2490,24 +2490,22 @@ sh_elf64_check_relocs (bfd *abfd, struct bfd_link_info *info, |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
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; |
@@ -3159,7 +3157,7 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
if (bed->plt_readonly) |
pltflags |= SEC_READONLY; |
- s = bfd_make_section_with_flags (abfd, ".plt", pltflags); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) |
return FALSE; |
@@ -3186,9 +3184,10 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
return FALSE; |
} |
- s = bfd_make_section_with_flags (abfd, |
- bed->default_use_rela_p ? ".rela.plt" : ".rel.plt", |
- flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, |
+ bed->default_use_rela_p |
+ ? ".rela.plt" : ".rel.plt", |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
return FALSE; |
@@ -3196,30 +3195,6 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
if (! _bfd_elf_create_got_section (abfd, info)) |
return FALSE; |
- { |
- const char *secname; |
- char *relname; |
- flagword secflags; |
- asection *sec; |
- |
- for (sec = abfd->sections; sec; sec = sec->next) |
- { |
- secflags = bfd_get_section_flags (abfd, sec); |
- if ((secflags & (SEC_DATA | SEC_LINKER_CREATED)) |
- || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS)) |
- continue; |
- secname = bfd_get_section_name (abfd, sec); |
- relname = (char *) bfd_malloc (strlen (secname) + 6); |
- strcpy (relname, ".rela"); |
- strcat (relname, secname); |
- s = bfd_make_section_with_flags (abfd, relname, |
- flags | SEC_READONLY); |
- if (s == NULL |
- || ! bfd_set_section_alignment (abfd, s, ptralign)) |
- return FALSE; |
- } |
- } |
- |
if (bed->want_dynbss) |
{ |
/* The .dynbss section is a place to put symbols which are defined |
@@ -3228,8 +3203,8 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
image and use a R_*_COPY reloc to tell the dynamic linker to |
initialize them at run time. The linker script puts the .dynbss |
section into the .bss section of the final image. */ |
- s = bfd_make_section_with_flags (abfd, ".dynbss", |
- SEC_ALLOC | SEC_LINKER_CREATED); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", |
+ SEC_ALLOC | SEC_LINKER_CREATED); |
if (s == NULL) |
return FALSE; |
@@ -3246,10 +3221,10 @@ sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
copy relocs. */ |
if (! info->shared) |
{ |
- s = bfd_make_section_with_flags (abfd, |
- (bed->default_use_rela_p |
- ? ".rela.bss" : ".rel.bss"), |
- flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, |
+ (bed->default_use_rela_p |
+ ? ".rela.bss" : ".rel.bss"), |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
return FALSE; |
@@ -3308,7 +3283,7 @@ sh64_elf64_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 |
@@ -3336,13 +3311,13 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info, |
/* We also need to make an entry in the .got.plt section, which |
will be placed in the .got section by the linker script. */ |
- s = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ s = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (s != NULL); |
s->size += 8; |
/* 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 (Elf64_External_Rela); |
@@ -3376,13 +3351,6 @@ sh64_elf64_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 |
@@ -3393,18 +3361,18 @@ sh64_elf64_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_SH_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 (Elf64_External_Rela); |
h->needs_copy = 1; |
@@ -3456,7 +3424,7 @@ sh64_elf64_size_dynamic_sections (bfd *output_bfd, |
/* 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; |
@@ -3469,7 +3437,7 @@ sh64_elf64_size_dynamic_sections (bfd *output_bfd, |
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; |
} |
@@ -3638,9 +3606,9 @@ sh64_elf64_finish_dynamic_symbol (bfd *output_bfd, |
BFD_ASSERT (h->dynindx != -1); |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got.plt"); |
- srel = bfd_get_section_by_name (dynobj, ".rela.plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got.plt"); |
+ srel = bfd_get_linker_section (dynobj, ".rela.plt"); |
BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); |
/* Get the index in the procedure linkage table which |
@@ -3741,8 +3709,8 @@ sh64_elf64_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"); |
- srel = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srel = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (sgot != NULL && srel != NULL); |
rel.r_offset = (sgot->output_section->vma |
@@ -3787,8 +3755,7 @@ sh64_elf64_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); |
rel.r_offset = (h->root.u.def.value |
@@ -3821,9 +3788,9 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd, |
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) |
{ |
@@ -3906,7 +3873,7 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd, |
} |
/* Fill in the first entry in the procedure linkage table. */ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
if (splt && splt->size > 0) |
{ |
if (info->shared) |