diff options
author | Daniel Jacobowitz <dan@debian.org> | 2004-09-16 17:02:14 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2004-09-16 17:02:14 +0000 |
commit | fca010d7bfaeb7657a222ae31a1ac6d2ff8b22a9 (patch) | |
tree | 04c103f9b8023e9e39971635650fcf0621942487 /bfd/elf32-s390.c | |
parent | 7d7c6fcee69a56637940d72acf1f5aec3c5c78f4 (diff) | |
download | gdb-fca010d7bfaeb7657a222ae31a1ac6d2ff8b22a9.tar.gz |
Merge mainline to intercu branch - 2004-09-15
Diffstat (limited to 'bfd/elf32-s390.c')
-rw-r--r-- | bfd/elf32-s390.c | 125 |
1 files changed, 66 insertions, 59 deletions
diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 074c1089342..72ae02e8328 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -411,7 +411,7 @@ s390_elf_ldisp_reloc (abfd, reloc_entry, symbol, data, input_section, if (output_bfd != NULL) return bfd_reloc_continue; - if (reloc_entry->address > input_section->_cooked_size) + if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) return bfd_reloc_outofrange; relocation = (symbol->value @@ -980,9 +980,8 @@ elf_s390_check_relocs (abfd, info, sec, relocs) if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { - (*_bfd_error_handler) (_("%s: bad symbol index: %d"), - bfd_archive_filename (abfd), - r_symndx); + (*_bfd_error_handler) (_("%B: bad symbol index: %d"), + abfd, r_symndx); return FALSE; } @@ -1158,8 +1157,8 @@ elf_s390_check_relocs (abfd, info, sec, relocs) if (old_tls_type == GOT_NORMAL || tls_type == GOT_NORMAL) { (*_bfd_error_handler) - (_("%s: `%s' accessed both as normal and thread local symbol"), - bfd_archive_filename (abfd), h->root.root.string); + (_("%B: `%s' accessed both as normal and thread local symbol"), + abfd, h->root.root.string); return FALSE; } if (old_tls_type > tls_type) @@ -1269,8 +1268,8 @@ elf_s390_check_relocs (abfd, info, sec, relocs) name + 5) != 0) { (*_bfd_error_handler) - (_("%s: bad relocation section name `%s\'"), - bfd_archive_filename (abfd), name); + (_("%B: bad relocation section name `%s\'"), + abfd, name); } if (htab->elf.dynobj == NULL) @@ -1687,7 +1686,7 @@ elf_s390_adjust_dynamic_symbol (info, h) runtime process image. */ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) { - htab->srelbss->_raw_size += sizeof (Elf32_External_Rela); + htab->srelbss->size += sizeof (Elf32_External_Rela); h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; } @@ -1699,7 +1698,7 @@ elf_s390_adjust_dynamic_symbol (info, h) /* Apply the required alignment. */ s = htab->sdynbss; - s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two)); + s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two)); if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s)) { if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two)) @@ -1708,10 +1707,10 @@ elf_s390_adjust_dynamic_symbol (info, h) /* Define the symbol as being at this point in the section. */ h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; + h->root.u.def.value = s->size; /* Increment the section size to make room for the symbol. */ - s->_raw_size += h->size; + s->size += h->size; return TRUE; } @@ -1762,10 +1761,10 @@ allocate_dynrelocs (h, inf) /* If this is the first .plt entry, make room for the special first entry. */ - if (s->_raw_size == 0) - s->_raw_size += PLT_FIRST_ENTRY_SIZE; + if (s->size == 0) + s->size += PLT_FIRST_ENTRY_SIZE; - h->plt.offset = s->_raw_size; + h->plt.offset = s->size; /* If this symbol is not defined in a regular file, and we are not generating a shared library, then set the symbol to this @@ -1780,14 +1779,14 @@ allocate_dynrelocs (h, inf) } /* Make room for this entry. */ - s->_raw_size += PLT_ENTRY_SIZE; + s->size += PLT_ENTRY_SIZE; /* We also need to make an entry in the .got.plt section, which will be placed in the .got section by the linker script. */ - htab->sgotplt->_raw_size += GOT_ENTRY_SIZE; + htab->sgotplt->size += GOT_ENTRY_SIZE; /* We also need to make an entry in the .rela.plt section. */ - htab->srelplt->_raw_size += sizeof (Elf32_External_Rela); + htab->srelplt->size += sizeof (Elf32_External_Rela); } else { @@ -1817,8 +1816,8 @@ allocate_dynrelocs (h, inf) to be stored somewhere. The immediate value in the instruction is not bit enough so the value is stored in the got. */ { - h->got.offset = htab->sgot->_raw_size; - htab->sgot->_raw_size += GOT_ENTRY_SIZE; + h->got.offset = htab->sgot->size; + htab->sgot->size += GOT_ENTRY_SIZE; } else h->got.offset = (bfd_vma) -1; @@ -1839,24 +1838,24 @@ allocate_dynrelocs (h, inf) } s = htab->sgot; - h->got.offset = s->_raw_size; - s->_raw_size += GOT_ENTRY_SIZE; + h->got.offset = s->size; + s->size += GOT_ENTRY_SIZE; /* R_390_TLS_GD32 needs 2 consecutive GOT slots. */ if (tls_type == GOT_TLS_GD) - s->_raw_size += GOT_ENTRY_SIZE; + s->size += GOT_ENTRY_SIZE; dyn = htab->elf.dynamic_sections_created; /* R_390_TLS_IE32 needs one dynamic relocation, R_390_TLS_GD32 needs one if local symbol and two if global. */ if ((tls_type == GOT_TLS_GD && h->dynindx == -1) || tls_type >= GOT_TLS_IE) - htab->srelgot->_raw_size += sizeof (Elf32_External_Rela); + htab->srelgot->size += sizeof (Elf32_External_Rela); else if (tls_type == GOT_TLS_GD) - htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rela); + htab->srelgot->size += 2 * sizeof (Elf32_External_Rela); else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) && (info->shared || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) - htab->srelgot->_raw_size += sizeof (Elf32_External_Rela); + htab->srelgot->size += sizeof (Elf32_External_Rela); } else h->got.offset = (bfd_vma) -1; @@ -1932,7 +1931,7 @@ allocate_dynrelocs (h, inf) { asection *sreloc = elf_section_data (p->sec)->sreloc; - sreloc->_raw_size += p->count * sizeof (Elf32_External_Rela); + sreloc->size += p->count * sizeof (Elf32_External_Rela); } return TRUE; @@ -1995,7 +1994,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) s = bfd_get_section_by_name (dynobj, ".interp"); if (s == NULL) abort (); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; + s->size = sizeof ELF_DYNAMIC_INTERPRETER; s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; } } @@ -2034,7 +2033,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) else if (p->count != 0) { srela = elf_section_data (p->sec)->sreloc; - srela->_raw_size += p->count * sizeof (Elf32_External_Rela); + srela->size += p->count * sizeof (Elf32_External_Rela); if ((p->sec->output_section->flags & SEC_READONLY) != 0) info->flags |= DF_TEXTREL; } @@ -2055,12 +2054,12 @@ elf_s390_size_dynamic_sections (output_bfd, info) { if (*local_got > 0) { - *local_got = s->_raw_size; - s->_raw_size += GOT_ENTRY_SIZE; + *local_got = s->size; + s->size += GOT_ENTRY_SIZE; if (*local_tls_type == GOT_TLS_GD) - s->_raw_size += GOT_ENTRY_SIZE; + s->size += GOT_ENTRY_SIZE; if (info->shared) - srela->_raw_size += sizeof (Elf32_External_Rela); + srela->size += sizeof (Elf32_External_Rela); } else *local_got = (bfd_vma) -1; @@ -2071,9 +2070,9 @@ elf_s390_size_dynamic_sections (output_bfd, info) { /* Allocate 2 got entries and 1 dynamic reloc for R_390_TLS_LDM32 relocs. */ - htab->tls_ldm_got.offset = htab->sgot->_raw_size; - htab->sgot->_raw_size += 2 * GOT_ENTRY_SIZE; - htab->srelgot->_raw_size += sizeof (Elf32_External_Rela); + htab->tls_ldm_got.offset = htab->sgot->size; + htab->sgot->size += 2 * GOT_ENTRY_SIZE; + htab->srelgot->size += sizeof (Elf32_External_Rela); } else htab->tls_ldm_got.offset = -1; @@ -2099,7 +2098,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) } else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0) { - if (s->_raw_size != 0) + if (s->size != 0) relocs = TRUE; /* We use the reloc_count field as a counter if we need @@ -2112,7 +2111,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) continue; } - if (s->_raw_size == 0) + if (s->size == 0) { /* If we don't need this section, strip it from the output file. This is to handle .rela.bss and @@ -2133,7 +2132,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) section's contents are written out. This should not happen, but this way if it does, we get a R_390_NONE reloc instead of garbage. */ - s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size); + s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); if (s->contents == NULL) return FALSE; } @@ -2154,7 +2153,7 @@ elf_s390_size_dynamic_sections (output_bfd, info) return FALSE; } - if (htab->splt->_raw_size != 0) + if (htab->splt->size != 0) { if (!add_dynamic_entry (DT_PLTGOT, 0) || !add_dynamic_entry (DT_PLTRELSZ, 0) @@ -2231,9 +2230,9 @@ invalid_tls_insn (input_bfd, input_section, rel) howto = elf_howto_table + ELF32_R_TYPE (rel->r_info); (*_bfd_error_handler) - (_("%s(%s+0x%lx): invalid instruction for TLS relocation %s"), - bfd_archive_filename (input_bfd), - bfd_get_section_name (input_bfd, input_section), + (_("%B(%A+0x%lx): invalid instruction for TLS relocation %s"), + input_bfd, + input_section, (long) rel->r_offset, howto->name); } @@ -2993,9 +2992,9 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, && !((input_section->flags & SEC_DEBUGGING) != 0 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0)) (*_bfd_error_handler) - (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"), - bfd_archive_filename (input_bfd), - bfd_get_section_name (input_bfd, input_section), + (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"), + input_bfd, + input_section, (long) rel->r_offset, h->root.root.string); @@ -3043,9 +3042,8 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section, else { (*_bfd_error_handler) - (_("%s(%s+0x%lx): reloc against `%s': error %d"), - bfd_archive_filename (input_bfd), - bfd_get_section_name (input_bfd, input_section), + (_("%B(%A+0x%lx): reloc against `%s': error %d"), + input_bfd, input_section, (long) rel->r_offset, name, (int) r); return FALSE; } @@ -3330,7 +3328,7 @@ elf_s390_finish_dynamic_sections (output_bfd, info) abort (); dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); + dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); for (; dyncon < dynconend; dyncon++) { Elf_Internal_Dyn dyn; @@ -3353,10 +3351,7 @@ elf_s390_finish_dynamic_sections (output_bfd, info) case DT_PLTRELSZ: s = htab->srelplt->output_section; - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size; - else - dyn.d_un.d_val = s->_raw_size; + dyn.d_un.d_val = s->size; break; } @@ -3364,7 +3359,7 @@ elf_s390_finish_dynamic_sections (output_bfd, info) } /* Fill in the special first entry in the procedure linkage table. */ - if (htab->splt && htab->splt->_raw_size > 0) + if (htab->splt && htab->splt->size > 0) { memset (htab->splt->contents, 0, PLT_FIRST_ENTRY_SIZE); if (info->shared) @@ -3408,7 +3403,7 @@ elf_s390_finish_dynamic_sections (output_bfd, info) if (htab->sgotplt) { /* Fill in the first three entries in the global offset table. */ - if (htab->sgotplt->_raw_size > 0) + if (htab->sgotplt->size > 0) { bfd_put_32 (output_bfd, (sdyn == NULL ? (bfd_vma) 0 @@ -3432,7 +3427,7 @@ elf_s390_grok_prstatus (abfd, note) Elf_Internal_Note * note; { int offset; - unsigned int raw_size; + unsigned int size; switch (note->descsz) { @@ -3448,15 +3443,26 @@ elf_s390_grok_prstatus (abfd, note) /* pr_reg */ offset = 72; - raw_size = 144; + size = 144; break; } /* Make a ".reg/999" section. */ return _bfd_elfcore_make_pseudosection (abfd, ".reg", - raw_size, note->descpos + offset); + size, note->descpos + offset); } +/* Return address for Ith PLT stub in section PLT, for relocation REL + or (bfd_vma) -1 if it should not be included. */ + +static bfd_vma +elf_s390_plt_sym_val (bfd_vma i, const asection *plt, + const arelent *rel ATTRIBUTE_UNUSED) +{ + return plt->vma + PLT_FIRST_ENTRY_SIZE + i * PLT_ENTRY_SIZE; +} + + #define TARGET_BIG_SYM bfd_elf32_s390_vec #define TARGET_BIG_NAME "elf32-s390" #define ELF_ARCH bfd_arch_s390 @@ -3491,6 +3497,7 @@ elf_s390_grok_prstatus (abfd, note) #define elf_backend_size_dynamic_sections elf_s390_size_dynamic_sections #define elf_backend_reloc_type_class elf_s390_reloc_type_class #define elf_backend_grok_prstatus elf_s390_grok_prstatus +#define elf_backend_plt_sym_val elf_s390_plt_sym_val #define bfd_elf32_mkobject elf_s390_mkobject #define elf_backend_object_p elf_s390_object_p |