Index: bfd/elf32-m32r.c |
diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c |
index 37d995d14c362308fa3c95ad5433d530c1da2067..e3e3bb051b5e300b87a6bc69dcb35998c150f24b 100644 |
--- a/bfd/elf32-m32r.c |
+++ b/bfd/elf32-m32r.c |
@@ -1,6 +1,6 @@ |
/* M32R-specific support for 32-bit ELF. |
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, |
- 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. |
+ 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
@@ -1625,9 +1625,9 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) |
if (htab == NULL) |
return FALSE; |
- htab->sgot = bfd_get_section_by_name (dynobj, ".got"); |
- htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); |
- htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ htab->sgot = bfd_get_linker_section (dynobj, ".got"); |
+ htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); |
+ htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot) |
abort (); |
@@ -1661,7 +1661,7 @@ m32r_elf_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); |
htab->splt = s; |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) |
@@ -1689,9 +1689,10 @@ m32r_elf_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); |
htab->srelplt = s; |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
@@ -1701,32 +1702,6 @@ m32r_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
&& ! 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 = bfd_malloc ((bfd_size_type) strlen (secname) + 6); |
- strcpy (relname, ".rela"); |
- strcat (relname, secname); |
- if (bfd_get_section_by_name (abfd, secname)) |
- continue; |
- 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 |
@@ -1735,8 +1710,8 @@ m32r_elf_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); |
htab->sdynbss = s; |
if (s == NULL) |
return FALSE; |
@@ -1753,10 +1728,10 @@ m32r_elf_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); |
htab->srelbss = s; |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
@@ -1922,13 +1897,6 @@ m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info, |
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 |
@@ -1950,7 +1918,7 @@ m32r_elf_adjust_dynamic_symbol (struct bfd_link_info *info, |
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; |
@@ -2209,7 +2177,7 @@ m32r_elf_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; |
@@ -2620,9 +2588,9 @@ m32r_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 && !use_rel) |
{ |
@@ -2821,7 +2789,8 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
/* We need to generate a R_M32R_RELATIVE reloc |
for the dynamic linker. */ |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, |
+ ".rela.got"); |
BFD_ASSERT (srelgot != NULL); |
outrel.r_offset = (sgot->output_section->vma |
@@ -3014,7 +2983,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, |
const char *name; |
BFD_ASSERT (sec != NULL); |
- name = bfd_get_section_name (abfd, sec); |
+ name = bfd_get_section_name (sec->owner, sec); |
if ( strcmp (name, ".sdata") == 0 |
|| strcmp (name, ".sbss") == 0 |
@@ -3311,8 +3280,7 @@ m32r_elf_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 (htab->root.dynobj, ".rela.bss"); |
BFD_ASSERT (s != NULL); |
rela.r_offset = (h->root.u.def.value |
@@ -3357,7 +3325,7 @@ m32r_elf_finish_dynamic_sections (bfd *output_bfd, |
dynobj = htab->root.dynobj; |
sgot = htab->sgotplt; |
- sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); |
+ sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
if (htab->root.dynamic_sections_created) |
{ |