diff options
Diffstat (limited to 'binutils-2.22/bfd/elf32-vax.c')
-rw-r--r-- | binutils-2.22/bfd/elf32-vax.c | 107 |
1 files changed, 48 insertions, 59 deletions
diff --git a/binutils-2.22/bfd/elf32-vax.c b/binutils-2.22/bfd/elf32-vax.c index 643381c..84ec972 100644 --- a/binutils-2.22/bfd/elf32-vax.c +++ b/binutils-2.22/bfd/elf32-vax.c @@ -1,6 +1,6 @@ /* VAX series support for 32-bit ELF Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. Contributed by Matt Thomas <matt@3am-software.com>. @@ -53,7 +53,7 @@ static bfd_vma elf_vax_plt_sym_val (bfd_vma, const asection *, static bfd_boolean elf32_vax_set_private_flags (bfd *, flagword); static bfd_boolean elf32_vax_merge_private_bfd_data (bfd *, bfd *); -static bfd_boolean elf32_vax_print_private_bfd_data (bfd *, PTR); +static bfd_boolean elf32_vax_print_private_bfd_data (bfd *, void *); static reloc_howto_type howto_table[] = { HOWTO (R_VAX_NONE, /* type */ @@ -423,7 +423,7 @@ static bfd_boolean elf_vax_instantiate_got_entries (struct elf_link_hash_entry * #define elf_vax_link_hash_traverse(table, func, info) \ (elf_link_hash_traverse \ ((table), \ - (bfd_boolean (*) (struct elf_link_hash_entry *, PTR)) (func), \ + (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \ (info))) /* Create an entry in an VAX ELF linker hash table. */ @@ -514,7 +514,7 @@ elf32_vax_merge_private_bfd_data (bfd *ibfd, bfd *obfd) /* Display the flags field */ static bfd_boolean -elf32_vax_print_private_bfd_data (bfd *abfd, PTR ptr) +elf32_vax_print_private_bfd_data (bfd *abfd, void * ptr) { FILE *file = (FILE *) ptr; @@ -613,24 +613,23 @@ elf_vax_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->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; @@ -967,7 +966,7 @@ elf_vax_adjust_dynamic_symbol (info, h) 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 @@ -997,13 +996,13 @@ elf_vax_adjust_dynamic_symbol (info, h) /* 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); @@ -1036,13 +1035,6 @@ elf_vax_adjust_dynamic_symbol (info, h) if (info->shared) 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 @@ -1053,18 +1045,18 @@ elf_vax_adjust_dynamic_symbol (info, h) 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_VAX_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; @@ -1092,7 +1084,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) /* 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; @@ -1105,13 +1097,13 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) not actually use these entries. Reset the size of .rela.got and .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; - s = bfd_get_section_by_name (dynobj, ".got.plt"); + s = bfd_get_linker_section (dynobj, ".got.plt"); if (s != NULL) s->size = 0; - s = bfd_get_section_by_name (dynobj, ".got"); + s = bfd_get_linker_section (dynobj, ".got"); if (s != NULL) s->size = 0; } @@ -1130,7 +1122,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) instantiate (allocate space for them). */ elf_link_hash_traverse (elf_hash_table (info), elf_vax_instantiate_got_entries, - (PTR) info); + info); /* The check_relocs and adjust_dynamic_symbol entry points have determined the sizes of the various dynamic sections. Allocate @@ -1269,7 +1261,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) static bfd_boolean elf_vax_discard_copies (struct elf_vax_link_hash_entry *h, - PTR ignore ATTRIBUTE_UNUSED) + void * ignore ATTRIBUTE_UNUSED) { struct elf_vax_pcrel_relocs_copied *s; @@ -1291,7 +1283,7 @@ elf_vax_discard_copies (struct elf_vax_link_hash_entry *h, will be reserved for the symbol. */ static bfd_boolean -elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, PTR infoptr) +elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, void * infoptr) { struct bfd_link_info *info = (struct bfd_link_info *) infoptr; bfd *dynobj; @@ -1306,8 +1298,8 @@ elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, PTR infoptr) if (dynobj == NULL) return TRUE; - 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"); if (!elf_hash_table (info)->dynamic_sections_created || (info->shared && info->symbolic) @@ -1450,9 +1442,9 @@ elf_vax_relocate_section (bfd *output_bfd, relocation = 0; } - 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; @@ -1477,7 +1469,7 @@ elf_vax_relocate_section (bfd *output_bfd, if (sgot == NULL) { - sgot = bfd_get_section_by_name (dynobj, ".got"); + sgot = bfd_get_linker_section (dynobj, ".got"); BFD_ASSERT (sgot != NULL); } @@ -1553,13 +1545,13 @@ elf_vax_relocate_section (bfd *output_bfd, if (splt == NULL) { - splt = bfd_get_section_by_name (dynobj, ".plt"); + splt = bfd_get_linker_section (dynobj, ".plt"); BFD_ASSERT (splt != NULL); } if (sgotplt == NULL) { - sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); + sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); BFD_ASSERT (sgotplt != NULL); } @@ -1698,14 +1690,12 @@ elf_vax_relocate_section (bfd *output_bfd, } } - if (!strcmp (bfd_get_section_name (input_bfd, input_section), - ".text") != 0 || - (info->shared - && ELF32_R_TYPE(outrel.r_info) != R_VAX_32 - && ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE - && ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY - && ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT - && ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT)) + if ((input_section->flags & SEC_CODE) != 0 + || (ELF32_R_TYPE (outrel.r_info) != R_VAX_32 + && ELF32_R_TYPE (outrel.r_info) != R_VAX_RELATIVE + && ELF32_R_TYPE (outrel.r_info) != R_VAX_COPY + && ELF32_R_TYPE (outrel.r_info) != R_VAX_JMP_SLOT + && ELF32_R_TYPE (outrel.r_info) != R_VAX_GLOB_DAT)) { if (h != NULL) (*_bfd_error_handler) @@ -1817,9 +1807,9 @@ elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, it up. */ BFD_ASSERT (h->dynindx != -1); - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - srela = bfd_get_section_by_name (dynobj, ".rela.plt"); + splt = bfd_get_linker_section (dynobj, ".plt"); + sgot = bfd_get_linker_section (dynobj, ".got.plt"); + srela = bfd_get_linker_section (dynobj, ".rela.plt"); BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL); addend = 2 * (h->plt.offset & 1); @@ -1881,8 +1871,8 @@ elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, /* 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 @@ -1923,8 +1913,7 @@ elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, && (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 @@ -1955,16 +1944,16 @@ elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *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; |