Index: bfd/elf32-cr16.c |
diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c |
index 0118131bead1730a0a46c4a93ccaa2689d199a8c..97fa5691e600ce61f87230e13512f705a8693c58 100644 |
--- a/bfd/elf32-cr16.c |
+++ b/bfd/elf32-cr16.c |
@@ -1,5 +1,5 @@ |
/* BFD back-end for National Semiconductor's CR16 ELF |
- Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
+ Copyright 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. |
Written by M R Swami Reddy. |
This file is part of BFD, the Binary File Descriptor library. |
@@ -585,7 +585,7 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info) |
int ptralign; |
/* This function may be called more than once. */ |
- if (bfd_get_section_by_name (abfd, ".got") != NULL) |
+ if (bfd_get_linker_section (abfd, ".got") != NULL) |
return TRUE; |
switch (bed->s->arch_size) |
@@ -606,14 +606,14 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info) |
flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY |
| SEC_LINKER_CREATED); |
- s = bfd_make_section_with_flags (abfd, ".got", flags); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
return FALSE; |
if (bed->want_got_plt) |
{ |
- s = bfd_make_section_with_flags (abfd, ".got.plt", flags); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, ptralign)) |
return FALSE; |
@@ -752,24 +752,22 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, |
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->executable)) |
{ |
- 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)) |
goto fail; |
@@ -1047,7 +1045,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
} |
else if (r_type == R_CR16_GOT_REGREL20) |
{ |
- asection * sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ asection * sgot = bfd_get_linker_section (dynobj, ".got"); |
if (h != NULL) |
{ |
@@ -1096,7 +1094,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
else if (r_type == R_CR16_GOTC_REGREL20) |
{ |
asection * sgot; |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
if (h != NULL) |
{ |
@@ -1431,9 +1429,9 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info, |
unresolved_reloc, warned); |
} |
- 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; |
@@ -2278,10 +2276,10 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY |
| SEC_LINKER_CREATED); |
- 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; |
@@ -2289,32 +2287,6 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
if (! _bfd_cr16_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 |
@@ -2323,8 +2295,8 @@ _bfd_cr16_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); |
if (s == NULL) |
return FALSE; |
@@ -2341,10 +2313,10 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) |
copy relocs. */ |
if (! info->executable) |
{ |
- 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; |
@@ -2406,13 +2378,13 @@ _bfd_cr16_elf_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 += 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); |
@@ -2446,13 +2418,6 @@ _bfd_cr16_elf_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 |
@@ -2463,18 +2428,18 @@ _bfd_cr16_elf_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_CR16_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; |
@@ -2504,7 +2469,7 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd, |
if (info->executable) |
{ |
#if 0 |
- 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; |
@@ -2518,7 +2483,7 @@ _bfd_cr16_elf_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; |
} |
@@ -2673,8 +2638,8 @@ _bfd_cr16_elf_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 |
@@ -2718,8 +2683,7 @@ _bfd_cr16_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 (dynobj, ".rela.bss"); |
BFD_ASSERT (s != NULL); |
rel.r_offset = (h->root.u.def.value |
@@ -2753,9 +2717,9 @@ _bfd_cr16_elf_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) |
{ |