Index: bfd/sunos.c |
diff --git a/bfd/sunos.c b/bfd/sunos.c |
index 8ef25edbb1cfa9cf045375664caa72c8b3f2094a..028fb280e3b12a55a77245b74f1f8ed15d63e2aa 100644 |
--- a/bfd/sunos.c |
+++ b/bfd/sunos.c |
@@ -1,6 +1,6 @@ |
/* BFD backend for SunOS binaries. |
Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2011 |
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 |
Free Software Foundation, Inc. |
Written by Cygnus Support. |
@@ -28,6 +28,7 @@ |
the tokens. */ |
#define MY(OP) CONCAT2 (sunos_big_,OP) |
+#include "sysdep.h" |
#include "bfd.h" |
#include "bfdlink.h" |
#include "libaout.h" |
@@ -747,49 +748,53 @@ sunos_create_dynamic_sections (bfd *abfd, |
/* The .dynamic section holds the basic dynamic information: the |
sun4_dynamic structure, the dynamic debugger information, and |
the sun4_dynamic_link structure. */ |
- s = bfd_make_section_with_flags (abfd, ".dynamic", flags); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".dynamic", flags); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
/* The .got section holds the global offset table. The address |
is put in the ld_got field. */ |
- 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, 2)) |
return FALSE; |
/* The .plt section holds the procedure linkage table. The |
address is put in the ld_plt field. */ |
- s = bfd_make_section_with_flags (abfd, ".plt", flags | SEC_CODE); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_CODE); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
/* The .dynrel section holds the dynamic relocs. The address is |
put in the ld_rel field. */ |
- s = bfd_make_section_with_flags (abfd, ".dynrel", flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".dynrel", |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
/* The .hash section holds the dynamic hash table. The address |
is put in the ld_hash field. */ |
- s = bfd_make_section_with_flags (abfd, ".hash", flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".hash", |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
/* The .dynsym section holds the dynamic symbols. The address |
is put in the ld_stab field. */ |
- s = bfd_make_section_with_flags (abfd, ".dynsym", flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".dynsym", |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
/* The .dynstr section holds the dynamic symbol string table. |
The address is put in the ld_symbols field. */ |
- s = bfd_make_section_with_flags (abfd, ".dynstr", flags | SEC_READONLY); |
+ s = bfd_make_section_anyway_with_flags (abfd, ".dynstr", |
+ flags | SEC_READONLY); |
if (s == NULL |
|| ! bfd_set_section_alignment (abfd, s, 2)) |
return FALSE; |
@@ -804,7 +809,7 @@ sunos_create_dynamic_sections (bfd *abfd, |
dynobj = sunos_hash_table (info)->dynobj; |
- s = bfd_get_section_by_name (dynobj, ".got"); |
+ s = bfd_get_linker_section (dynobj, ".got"); |
if (s->size == 0) |
s->size = BYTES_IN_WORD; |
@@ -1324,11 +1329,11 @@ sunos_scan_std_relocs (struct bfd_link_info *info, |
if (! sunos_create_dynamic_sections (abfd, info, FALSE)) |
return FALSE; |
dynobj = sunos_hash_table (info)->dynobj; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- srel = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ srel = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (splt != NULL && srel != NULL); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
if (sgot->size == 0) |
sgot->size = BYTES_IN_WORD; |
@@ -1474,9 +1479,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info, |
if (! sunos_create_dynamic_sections (abfd, info, FALSE)) |
return FALSE; |
dynobj = sunos_hash_table (info)->dynobj; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srel = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srel = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); |
/* Make sure we have an initial entry in the .got table. */ |
@@ -1542,9 +1547,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info, |
if (! sunos_create_dynamic_sections (abfd, info, TRUE)) |
return FALSE; |
dynobj = sunos_hash_table (info)->dynobj; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srel = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srel = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); |
} |
@@ -1589,9 +1594,9 @@ sunos_scan_ext_relocs (struct bfd_link_info *info, |
if (! sunos_create_dynamic_sections (abfd, info, FALSE)) |
return FALSE; |
dynobj = sunos_hash_table (info)->dynobj; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srel = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srel = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); |
/* Make sure we have an initial entry in the .got table. */ |
@@ -1814,7 +1819,7 @@ sunos_scan_dynamic_symbol (struct sunos_link_hash_entry *h, void * data) |
regular symbols includes the debugging symbols, which have |
long names and are often duplicated in several object files. |
There are no debugging symbols in the dynamic symbols. */ |
- s = bfd_get_section_by_name (dynobj, ".dynstr"); |
+ s = bfd_get_linker_section (dynobj, ".dynstr"); |
BFD_ASSERT (s != NULL); |
contents = bfd_realloc (s->contents, s->size + len + 1); |
if (contents == NULL) |
@@ -1833,7 +1838,7 @@ sunos_scan_dynamic_symbol (struct sunos_link_hash_entry *h, void * data) |
hash &= 0x7fffffff; |
hash %= sunos_hash_table (info)->bucketcount; |
- s = bfd_get_section_by_name (dynobj, ".hash"); |
+ s = bfd_get_linker_section (dynobj, ".hash"); |
BFD_ASSERT (s != NULL); |
if (GET_SWORD (dynobj, s->contents + hash * HASH_ENTRY_SIZE) == -1) |
@@ -1930,14 +1935,14 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
++sunos_hash_table (info)->dynsymcount; |
h->dynindx = -2; |
} |
+ s = bfd_get_linker_section (dynobj, ".got"); |
+ BFD_ASSERT (s != NULL); |
h->root.root.type = bfd_link_hash_defined; |
- h->root.root.u.def.section = bfd_get_section_by_name (dynobj, ".got"); |
+ h->root.root.u.def.section = s; |
/* If the .got section is more than 0x1000 bytes, we set |
__GLOBAL_OFFSET_TABLE_ to be 0x1000 bytes into the section, |
so that 13 bit relocations have a greater chance of working. */ |
- s = bfd_get_section_by_name (dynobj, ".got"); |
- BFD_ASSERT (s != NULL); |
if (s->size >= 0x1000) |
h->root.root.u.def.value = 0x1000; |
else |
@@ -1950,7 +1955,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
up the dynamic linking information. */ |
if (sunos_hash_table (info)->dynamic_sections_needed) |
{ |
- *sdynptr = bfd_get_section_by_name (dynobj, ".dynamic"); |
+ *sdynptr = bfd_get_linker_section (dynobj, ".dynamic"); |
/* The .dynamic section is always the same size. */ |
s = *sdynptr; |
@@ -1967,7 +1972,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
symbols. We build the dynamic symbol string table (.dynstr) |
in a traversal of the symbol table using |
sunos_scan_dynamic_symbol. */ |
- s = bfd_get_section_by_name (dynobj, ".dynsym"); |
+ s = bfd_get_linker_section (dynobj, ".dynsym"); |
BFD_ASSERT (s != NULL); |
s->size = dynsymcount * sizeof (struct external_nlist); |
s->contents = bfd_alloc (output_bfd, s->size); |
@@ -1988,7 +1993,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
bucketcount = dynsymcount; |
else |
bucketcount = 1; |
- s = bfd_get_section_by_name (dynobj, ".hash"); |
+ s = bfd_get_linker_section (dynobj, ".hash"); |
BFD_ASSERT (s != NULL); |
hashalloc = (dynsymcount + bucketcount - 1) * HASH_ENTRY_SIZE; |
s->contents = bfd_zalloc (dynobj, hashalloc); |
@@ -2012,7 +2017,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
/* The SunOS native linker seems to align the total size of the |
symbol strings to a multiple of 8. I don't know if this is |
important, but it can't hurt much. */ |
- s = bfd_get_section_by_name (dynobj, ".dynstr"); |
+ s = bfd_get_linker_section (dynobj, ".dynstr"); |
BFD_ASSERT (s != NULL); |
if ((s->size & 7) != 0) |
{ |
@@ -2031,7 +2036,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
/* Now that we have worked out the sizes of the procedure linkage |
table and the dynamic relocs, allocate storage for them. */ |
- s = bfd_get_section_by_name (dynobj, ".plt"); |
+ s = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (s != NULL); |
if (s->size != 0) |
{ |
@@ -2055,7 +2060,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
} |
} |
- s = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ s = bfd_get_linker_section (dynobj, ".dynrel"); |
if (s->size != 0) |
{ |
s->contents = bfd_alloc (dynobj, s->size); |
@@ -2067,7 +2072,7 @@ bfd_sunos_size_dynamic_sections (bfd *output_bfd, |
s->reloc_count = 0; |
/* Make space for the global offset table. */ |
- s = bfd_get_section_by_name (dynobj, ".got"); |
+ s = bfd_get_linker_section (dynobj, ".got"); |
s->contents = bfd_alloc (dynobj, s->size); |
if (s->contents == NULL) |
return FALSE; |
@@ -2113,10 +2118,10 @@ sunos_write_dynamic_symbol (bfd *output_bfd, |
bfd_vma r_address; |
dynobj = sunos_hash_table (info)->dynobj; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
p = splt->contents + h->plt_offset; |
- s = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ s = bfd_get_linker_section (dynobj, ".dynrel"); |
r_address = (splt->output_section->vma |
+ splt->output_offset |
@@ -2300,7 +2305,7 @@ sunos_write_dynamic_symbol (bfd *output_bfd, |
return TRUE; |
} |
- s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynsym"); |
+ s = bfd_get_linker_section (sunos_hash_table (info)->dynobj, ".dynsym"); |
BFD_ASSERT (s != NULL); |
outsym = ((struct external_nlist *) |
(s->contents + h->dynindx * EXTERNAL_NLIST_SIZE)); |
@@ -2355,7 +2360,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info, |
asection *splt; |
/* Redirect the relocation to the PLT entry. */ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
*relocationp = (splt->output_section->vma |
+ splt->output_offset |
+ h->plt_offset); |
@@ -2450,7 +2455,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info, |
BFD_ASSERT (got_offsetp != NULL && *got_offsetp != 0); |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
/* We set the least significant bit to indicate whether we have |
already initialized the GOT entry. */ |
@@ -2472,7 +2477,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info, |
/* We need to create a GLOB_DAT or 32 reloc to tell the |
dynamic linker to fill in this entry in the table. */ |
- s = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ s = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (s != NULL); |
BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) |
< s->size); |
@@ -2602,7 +2607,7 @@ sunos_check_dynamic_reloc (struct bfd_link_info *info, |
/* It looks like this is a reloc we are supposed to copy. */ |
- s = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ s = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (s != NULL); |
BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) < s->size); |
@@ -2700,7 +2705,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info) |
dynobj = sunos_hash_table (info)->dynobj; |
- sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); |
+ sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
BFD_ASSERT (sdyn != NULL); |
/* Finish up the .need section. The linker emulation code filled it |
@@ -2730,7 +2735,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info) |
/* The first entry in the .got section is the address of the |
dynamic information, unless this is a shared library. */ |
- s = bfd_get_section_by_name (dynobj, ".got"); |
+ s = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (s != NULL); |
if (info->shared || sdyn->size == 0) |
PUT_WORD (dynobj, 0, s->contents); |
@@ -2792,30 +2797,30 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info) |
PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, |
esdl.ld_rules); |
- s = bfd_get_section_by_name (dynobj, ".got"); |
+ s = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (s != NULL); |
PUT_WORD (dynobj, s->output_section->vma + s->output_offset, |
esdl.ld_got); |
- s = bfd_get_section_by_name (dynobj, ".plt"); |
+ s = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (s != NULL); |
PUT_WORD (dynobj, s->output_section->vma + s->output_offset, |
esdl.ld_plt); |
PUT_WORD (dynobj, s->size, esdl.ld_plt_sz); |
- s = bfd_get_section_by_name (dynobj, ".dynrel"); |
+ s = bfd_get_linker_section (dynobj, ".dynrel"); |
BFD_ASSERT (s != NULL); |
BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) |
== s->size); |
PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, |
esdl.ld_rel); |
- s = bfd_get_section_by_name (dynobj, ".hash"); |
+ s = bfd_get_linker_section (dynobj, ".hash"); |
BFD_ASSERT (s != NULL); |
PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, |
esdl.ld_hash); |
- s = bfd_get_section_by_name (dynobj, ".dynsym"); |
+ s = bfd_get_linker_section (dynobj, ".dynsym"); |
BFD_ASSERT (s != NULL); |
PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, |
esdl.ld_stab); |
@@ -2825,7 +2830,7 @@ sunos_finish_dynamic_link (bfd *abfd, struct bfd_link_info *info) |
PUT_WORD (dynobj, (bfd_vma) sunos_hash_table (info)->bucketcount, |
esdl.ld_buckets); |
- s = bfd_get_section_by_name (dynobj, ".dynstr"); |
+ s = bfd_get_linker_section (dynobj, ".dynstr"); |
BFD_ASSERT (s != NULL); |
PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, |
esdl.ld_symbols); |