diff options
author | Alan Modra <amodra@gmail.com> | 2005-05-07 02:55:55 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-05-07 02:55:55 +0000 |
commit | 3b36f7e6294151e194b7bf437379e9dcf5b857cb (patch) | |
tree | 8731fe456070e99d18865e8872e04ad119dd3fa0 | |
parent | c18bae34de482f2dc415694af45bd21f1a78715b (diff) | |
download | ppe42-binutils-3b36f7e6294151e194b7bf437379e9dcf5b857cb.tar.gz ppe42-binutils-3b36f7e6294151e194b7bf437379e9dcf5b857cb.zip |
bfd/
* elf-bfd.h (struct elf_backend_data): Remove got_symbol_offset.
* elfxx-target.h (elf_backend_got_symbol_offset): Delete.
* elflink.c (_bfd_elf_create_got_section): Use zero in place of
got_symbol_offset.
* elf-m10300.c (_bfd_mn10300_elf_create_got_section): Likewise.
* elf32-frv.c (_frv_create_got_section): Likewise.
* elf32-i370.c (i370_elf_finish_dynamic_sections): Delete ppc code.
(elf_backend_got_symbol_offset): Don't define.
* elf64-ppc.c (elf_backend_got_symbol_offset): Don't define.
* elf32-ppc.c (struct ppc_elf_link_hash_table): Add got_header_size
and got_gap.
(ppc_elf_create_got): Tidy.
(ppc_elf_create_dynamic_sections): Don't set SEC_IN_MEMORY for .plt.
(ppc_elf_check_relocs): Reduce string comparisons by using elf.hgot.
(ppc_elf_gc_sweep_hook): Likewise.
(ppc_elf_relocate_section): Likewise.
(ppc_elf_finish_dynamic_symbol): Likewise.
(allocate_got): New function.
(allocate_dynrelocs): Use allocate_got.
(ppc_elf_size_dynamic_sections): Likewise. Delay tlsld_got allocation
so that local got can refcount it. Set got_header_size.
(ppc_elf_relocate_section): Use value of elf.hgot rather than hard-
coded 4.
(ppc_elf_finish_dynamic_sections): Likewise.
(elf_backend_got_symbol_offset): Don't define.
(elf_backend_got_header_size): Ditto.
ld/testsuite/
* ld-powerpc/tlsexe32.d: Update for changed got layout.
* ld-powerpc/tlsexe32.g: Likewise.
* ld-powerpc/tlsexe32.r: Likewise.
* ld-powerpc/tlsso32.d: Likewise.
* ld-powerpc/tlsso32.g: Likewise.
* ld-powerpc/tlsso32.r: Likewise.
-rw-r--r-- | bfd/ChangeLog | 29 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 4 | ||||
-rw-r--r-- | bfd/elf-m10300.c | 53 | ||||
-rw-r--r-- | bfd/elf32-frv.c | 255 | ||||
-rw-r--r-- | bfd/elf32-i370.c | 31 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 191 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 5 | ||||
-rw-r--r-- | bfd/elflink.c | 26 | ||||
-rw-r--r-- | bfd/elfxx-target.h | 6 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsexe32.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsexe32.g | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsexe32.r | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsso32.d | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsso32.g | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/tlsso32.r | 18 |
16 files changed, 366 insertions, 307 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9ff123a61d..095607ac72 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,32 @@ +2005-05-07 Alan Modra <amodra@bigpond.net.au> + + * elf-bfd.h (struct elf_backend_data): Remove got_symbol_offset. + * elfxx-target.h (elf_backend_got_symbol_offset): Delete. + * elflink.c (_bfd_elf_create_got_section): Use zero in place of + got_symbol_offset. + * elf-m10300.c (_bfd_mn10300_elf_create_got_section): Likewise. + * elf32-frv.c (_frv_create_got_section): Likewise. + * elf32-i370.c (i370_elf_finish_dynamic_sections): Delete ppc code. + (elf_backend_got_symbol_offset): Don't define. + * elf64-ppc.c (elf_backend_got_symbol_offset): Don't define. + * elf32-ppc.c (struct ppc_elf_link_hash_table): Add got_header_size + and got_gap. + (ppc_elf_create_got): Tidy. + (ppc_elf_create_dynamic_sections): Don't set SEC_IN_MEMORY for .plt. + (ppc_elf_check_relocs): Reduce string comparisons by using elf.hgot. + (ppc_elf_gc_sweep_hook): Likewise. + (ppc_elf_relocate_section): Likewise. + (ppc_elf_finish_dynamic_symbol): Likewise. + (allocate_got): New function. + (allocate_dynrelocs): Use allocate_got. + (ppc_elf_size_dynamic_sections): Likewise. Delay tlsld_got allocation + so that local got can refcount it. Set got_header_size. + (ppc_elf_relocate_section): Use value of elf.hgot rather than hard- + coded 4. + (ppc_elf_finish_dynamic_sections): Likewise. + (elf_backend_got_symbol_offset): Don't define. + (elf_backend_got_header_size): Ditto. + 2005-05-05 Steve Ellcey <sje@cup.hp.com> * configure.in (ACX_HEADER_STRING): New. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 47c122c650..1318b40ce6 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -977,10 +977,6 @@ struct elf_backend_data /* An array of target specific special section map. */ const struct bfd_elf_special_section *special_sections; - /* offset of the _GLOBAL_OFFSET_TABLE_ symbol from the start of the - .got section */ - bfd_vma got_symbol_offset; - /* The size in bytes of the header for the GOT. This includes the so-called reserved entries on some systems. */ bfd_vma got_header_size; diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index c9a9848f46..c78f04069e 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -620,8 +620,7 @@ _bfd_mn10300_elf_create_got_section (abfd, info) bh = NULL; if (!(_bfd_generic_link_add_one_symbol (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - bed->got_symbol_offset, (const char *) NULL, FALSE, - bed->collect, &bh))) + 0, (const char *) NULL, FALSE, bed->collect, &bh))) return FALSE; h = (struct elf_link_hash_entry *) bh; h->def_regular = 1; @@ -634,7 +633,7 @@ _bfd_mn10300_elf_create_got_section (abfd, info) elf_hash_table (info)->hgot = h; /* The first bit of the global offset table is the header. */ - s->size += bed->got_header_size + bed->got_symbol_offset; + s->size += bed->got_header_size; return TRUE; } @@ -809,7 +808,7 @@ mn10300_elf_check_relocs (abfd, info, sec, relocs) else { /* This is a global offset table entry for a local - symbol. */ + symbol. */ if (local_got_offsets == NULL) { size_t size; @@ -1186,7 +1185,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, bfd_put_32 (input_bfd, value, hit_data); return bfd_reloc_ok; - + case R_MN10300_GOTPC16: /* Use global offset table as symbol value. */ @@ -1207,7 +1206,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, value -= bfd_get_section_by_name (dynobj, ".got")->output_section->vma; value += addend; - + bfd_put_32 (input_bfd, value, hit_data); return bfd_reloc_ok; @@ -1215,7 +1214,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, value -= bfd_get_section_by_name (dynobj, ".got")->output_section->vma; value += addend; - + if ((long) value > 0x7fffff || (long) value < -0x800000) return bfd_reloc_overflow; @@ -1228,7 +1227,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, value -= bfd_get_section_by_name (dynobj, ".got")->output_section->vma; value += addend; - + if ((long) value > 0xffff || (long) value < -0x10000) return bfd_reloc_overflow; @@ -1244,7 +1243,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, asection * splt; splt = bfd_get_section_by_name (dynobj, ".plt"); - + value = (splt->output_section->vma + splt->output_offset + h->plt.offset) - value; @@ -1267,7 +1266,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, asection * splt; splt = bfd_get_section_by_name (dynobj, ".plt"); - + value = (splt->output_section->vma + splt->output_offset + h->plt.offset) - value; @@ -1291,7 +1290,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, asection * sgot; sgot = bfd_get_section_by_name (dynobj, ".got"); - + if (h != NULL) { bfd_vma off; @@ -1373,7 +1372,7 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd, return bfd_reloc_ok; } /* Fall through. */ - + default: return bfd_reloc_notsupported; } @@ -2383,7 +2382,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again) splt = bfd_get_section_by_name (elf_hash_table (link_info) ->dynobj, ".plt"); - + value = ((splt->output_section->vma + splt->output_offset + h->root.plt.offset) @@ -2760,16 +2759,16 @@ mn10300_elf_relax_section (abfd, sec, link_info, again) /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit equivalent instructions exists. */ - if (code != 0x6b && code != 0x7b + if (code != 0x6b && code != 0x7b && code != 0x8b && code != 0x9b && ((code & 0x0f) == 0x09 || (code & 0x0f) == 0x08 || (code & 0x0f) == 0x0a || (code & 0x0f) == 0x0b || (code & 0x0f) == 0x0e)) { /* Not safe if the high bit is on as relaxing may - move the value out of high mem and thus not fit - in a signed 8bit value. This is currently over - conservative. */ + move the value out of high mem and thus not fit + in a signed 8bit value. This is currently over + conservative. */ if ((value & 0x80) == 0) { /* Note that we've changed the relocation contents, @@ -2857,8 +2856,8 @@ mn10300_elf_relax_section (abfd, sec, link_info, again) if (code == 0xfe) { - /* Get the second opcode. */ - code = bfd_get_8 (abfd, contents + irel->r_offset - 2); + /* Get the second opcode. */ + code = bfd_get_8 (abfd, contents + irel->r_offset - 2); /* All the am33 32 -> 24 relaxing possibilities. */ /* We can not relax 0x6b, 0x7b, 0x8b, 0x9b as no 24bit @@ -2872,9 +2871,9 @@ mn10300_elf_relax_section (abfd, sec, link_info, again) || (code & 0x0f) == 0x0e)) { /* Not safe if the high bit is on as relaxing may - move the value out of high mem and thus not fit - in a signed 16bit value. This is currently over - conservative. */ + move the value out of high mem and thus not fit + in a signed 16bit value. This is currently over + conservative. */ if ((value & 0x8000) == 0) { /* Note that we've changed the relocation contents, @@ -3823,8 +3822,8 @@ _bfd_mn10300_elf_merge_private_bfd_data (ibfd, obfd) && bfd_get_mach (obfd) < bfd_get_mach (ibfd)) { if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), - bfd_get_mach (ibfd))) - return FALSE; + bfd_get_mach (ibfd))) + return FALSE; } return TRUE; @@ -4693,11 +4692,11 @@ _bfd_mn10300_elf_reloc_type_class (const Elf_Internal_Rela *rela) /* So we can set bits in e_flags. */ #define elf_backend_final_write_processing \ - _bfd_mn10300_elf_final_write_processing -#define elf_backend_object_p _bfd_mn10300_elf_object_p + _bfd_mn10300_elf_final_write_processing +#define elf_backend_object_p _bfd_mn10300_elf_object_p #define bfd_elf32_bfd_merge_private_bfd_data \ - _bfd_mn10300_elf_merge_private_bfd_data + _bfd_mn10300_elf_merge_private_bfd_data #define elf_backend_can_gc_sections 1 #define elf_backend_create_dynamic_sections \ diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 49768adfa1..5ff7791a8d 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -112,7 +112,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE), /* pcrel_offset */ /* A 16 bit pc-relative relocation. */ - HOWTO (R_FRV_LABEL16, /* type */ + HOWTO (R_FRV_LABEL16, /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -124,10 +124,10 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* A 24-bit pc-relative relocation. */ - HOWTO (R_FRV_LABEL24, /* type */ + HOWTO (R_FRV_LABEL24, /* type */ 2, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ @@ -139,9 +139,9 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0x7e03ffff, /* src_mask */ 0x7e03ffff, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ - HOWTO (R_FRV_LO16, /* type */ + HOWTO (R_FRV_LO16, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -153,9 +153,9 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_HI16, /* type */ + HOWTO (R_FRV_HI16, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -167,9 +167,9 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_GPREL12, /* type */ + HOWTO (R_FRV_GPREL12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -177,13 +177,13 @@ static reloc_howto_type elf32_frv_howto_table [] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_FRV_GPREL12", /* name */ + "R_FRV_GPREL12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_GPRELU12, /* type */ + HOWTO (R_FRV_GPRELU12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -191,13 +191,13 @@ static reloc_howto_type elf32_frv_howto_table [] = 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ - "R_FRV_GPRELU12", /* name */ + "R_FRV_GPRELU12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0x3f03f, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0x3f03f, /* dst_mask */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_GPREL32, /* type */ + HOWTO (R_FRV_GPREL32, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ @@ -207,11 +207,11 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GPREL32", /* name */ FALSE, /* partial_inplace */ - 0xffffffff, /* src_mask */ + 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_GPRELHI, /* type */ + HOWTO (R_FRV_GPRELHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -221,11 +221,11 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GPRELHI", /* name */ FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ + 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ - HOWTO (R_FRV_GPRELLO, /* type */ + HOWTO (R_FRV_GPRELLO, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -235,13 +235,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GPRELLO", /* name */ FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ + 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the address of the symbol. */ - HOWTO (R_FRV_GOT12, /* type */ + HOWTO (R_FRV_GOT12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -251,13 +251,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GOT12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_FRV_GOTHI, /* type */ + HOWTO (R_FRV_GOTHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -267,13 +267,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GOTHI", /* name */ FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ + 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_FRV_GOTLO, /* type */ + HOWTO (R_FRV_GOTLO, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -285,7 +285,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The 32-bit address of the canonical descriptor of a function. */ HOWTO (R_FRV_FUNCDESC, /* type */ @@ -314,9 +314,9 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_FUNCDESC_GOT12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -332,7 +332,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -348,7 +348,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The 64-bit descriptor of a function. */ HOWTO (R_FRV_FUNCDESC_VALUE, /* type */ @@ -377,9 +377,9 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_FUNCDESC_GOTOFF12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -395,7 +395,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -411,11 +411,11 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the address of the symbol. */ - HOWTO (R_FRV_GOTOFF12, /* type */ + HOWTO (R_FRV_GOTOFF12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -425,13 +425,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GOTOFF12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_FRV_GOTOFFHI, /* type */ + HOWTO (R_FRV_GOTOFFHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -443,7 +443,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the symbol. */ @@ -459,7 +459,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* A 24-bit pc-relative relocation referencing the TLS PLT entry for a thread-local symbol. If the symbol number is 0, it refers to @@ -476,7 +476,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0x7e03ffff, /* src_mask */ 0x7e03ffff, /* dst_mask */ - TRUE), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* A 64-bit TLS descriptor for a symbol. This relocation is only valid as a REL, dynamic relocation. */ @@ -496,7 +496,7 @@ static reloc_howto_type elf32_frv_howto_table [] = /* A 12-bit signed operand with the GOT offset for the TLS descriptor of the symbol. */ - HOWTO (R_FRV_GOTTLSDESC12, /* type */ + HOWTO (R_FRV_GOTTLSDESC12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -506,13 +506,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GOTTLSDESC12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the TLS descriptor of the symbol. */ - HOWTO (R_FRV_GOTTLSDESCHI, /* type */ + HOWTO (R_FRV_GOTTLSDESCHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -524,7 +524,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the TLS descriptor of the symbol. */ @@ -540,11 +540,11 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* A 12-bit signed operand with the offset from the module base address to the thread-local symbol address. */ - HOWTO (R_FRV_TLSMOFF12, /* type */ + HOWTO (R_FRV_TLSMOFF12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -554,13 +554,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_TLSMOFF12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the offset from the module base address to the thread-local symbol address. */ - HOWTO (R_FRV_TLSMOFFHI, /* type */ + HOWTO (R_FRV_TLSMOFFHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -572,7 +572,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the offset from the module base address to the thread-local symbol address. */ @@ -588,11 +588,11 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the TLSOFF entry for a symbol. */ - HOWTO (R_FRV_GOTTLSOFF12, /* type */ + HOWTO (R_FRV_GOTTLSOFF12, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 12, /* bitsize */ @@ -602,13 +602,13 @@ static reloc_howto_type elf32_frv_howto_table [] = bfd_elf_generic_reloc, /* special_function */ "R_FRV_GOTTLSOFF12", /* name */ FALSE, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - FALSE), /* pcrel_offset */ + 0xfff, /* src_mask */ + 0xfff, /* dst_mask */ + FALSE), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the TLSOFF entry for a symbol. */ - HOWTO (R_FRV_GOTTLSOFFHI, /* type */ + HOWTO (R_FRV_GOTTLSOFFHI, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ @@ -620,7 +620,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the TLSOFF entry for a symbol. */ @@ -636,7 +636,7 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* The 32-bit offset from the thread pointer (not the module base address) to a thread-local symbol. */ @@ -707,7 +707,7 @@ static reloc_howto_type elf32_frv_howto_table [] = /* A 32-bit offset from the module base address to the thread-local symbol address. */ - HOWTO (R_FRV_TLSMOFF, /* type */ + HOWTO (R_FRV_TLSMOFF, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ @@ -719,40 +719,40 @@ static reloc_howto_type elf32_frv_howto_table [] = FALSE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + FALSE), /* pcrel_offset */ }; /* GNU extension to record C++ vtable hierarchy. */ static reloc_howto_type elf32_frv_vtinherit_howto = - HOWTO (R_FRV_GNU_VTINHERIT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - NULL, /* special_function */ - "R_FRV_GNU_VTINHERIT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE); /* pcrel_offset */ + HOWTO (R_FRV_GNU_VTINHERIT, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + NULL, /* special_function */ + "R_FRV_GNU_VTINHERIT", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE); /* pcrel_offset */ /* GNU extension to record C++ vtable member usage. */ static reloc_howto_type elf32_frv_vtentry_howto = - HOWTO (R_FRV_GNU_VTENTRY, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - _bfd_elf_rel_vtable_reloc_fn, /* special_function */ - "R_FRV_GNU_VTENTRY", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE); /* pcrel_offset */ + HOWTO (R_FRV_GNU_VTENTRY, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_elf_rel_vtable_reloc_fn, /* special_function */ + "R_FRV_GNU_VTENTRY", /* name */ + FALSE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE); /* pcrel_offset */ /* The following 3 relocations are REL. The only difference to the entries in the table above are that partial_inplace is TRUE. */ @@ -1872,7 +1872,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, ->output_offset, R_FRV_TLSOFF, idx, ad, entry); } - + bfd_put_32 (output_bfd, ad, frvfdpic_got_section (info)->contents + frvfdpic_got_initial_offset (info) @@ -2004,7 +2004,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, { bfd_byte *plt_code = frvfdpic_plt_section (info)->contents + entry->tlsplt_entry; - + if (info->executable && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h))) @@ -2032,7 +2032,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, else idx = 0; } - + /* *ABS*+addend is special for TLS relocations, use only the addend for the TLS offset, and take the module id as 0. */ @@ -2044,7 +2044,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, TLS offset to the addend. */ else if (sec) ad += sec->output_section->vma - tls_biased_base (info); - + if ((bfd_signed_vma)ad >= -(1 << (16 - 1)) && (bfd_signed_vma)ad < (1 << (16 - 1))) { @@ -2974,7 +2974,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, (LOCAL_EXEC_P ((info), (picrel))) #define RELAX_TLSDESC_INITIAL_EXEC_P(info, picrel) \ (INITIAL_EXEC_P ((info), (picrel))) - + #define RELAX_GOTTLSOFF_LOCAL_EXEC_P(info, picrel, value) \ (LOCAL_EXEC_P ((info), (picrel)) \ && TLSMOFF_IN_RANGE_FOR_SETLOS_P((value), (info))) @@ -2991,7 +2991,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, name, input_bfd, input_section, rel->r_offset); return FALSE; } - + if (RELAX_GETTLSOFF_LOCAL_EXEC_P (info, picrel, relocation + rel->r_addend)) { @@ -3128,7 +3128,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, } break; - + case R_FRV_GOTTLSDESCLO: insn = bfd_get_32 (input_bfd, contents + rel->r_offset); @@ -3176,7 +3176,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, } break; - + case R_FRV_TLSDESC_RELAX: insn = bfd_get_32 (input_bfd, contents + rel->r_offset); @@ -3506,12 +3506,12 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* There's nothing to relax in these: - R_FRV_TLSDESC_VALUE - R_FRV_TLSOFF - R_FRV_TLSMOFF12 - R_FRV_TLSMOFFHI - R_FRV_TLSMOFFLO - R_FRV_TLSMOFF + R_FRV_TLSDESC_VALUE + R_FRV_TLSOFF + R_FRV_TLSMOFF12 + R_FRV_TLSMOFFHI + R_FRV_TLSMOFFLO + R_FRV_TLSMOFF */ default: @@ -3921,7 +3921,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, ? _frvfdpic_osec_to_segment (output_bfd, sec->output_section) : tls_segment; break; - + case R_FRV_TLSDESC_VALUE: case R_FRV_TLSOFF: /* These shouldn't be present in input object files. */ @@ -4304,8 +4304,7 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) bh = NULL; if (!(_bfd_generic_link_add_one_symbol (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - bed->got_symbol_offset, (const char *) NULL, FALSE, - bed->collect, &bh))) + 0, (const char *) NULL, FALSE, bed->collect, &bh))) return FALSE; h = (struct elf_link_hash_entry *) bh; h->def_regular = 1; @@ -4321,7 +4320,7 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) } /* The first bit of the global offset table is the header. */ - s->size += bed->got_header_size + bed->got_symbol_offset; + s->size += bed->got_header_size; /* This is the machine-specific part. Create and initialize section data for the got. */ @@ -4577,7 +4576,7 @@ _frvfdpic_count_tls_entries (struct frvfdpic_relocs_info *entry, bfd_boolean subtract) { const int l = subtract ? -1 : 1; - + /* Allocate space for a GOT entry with the TLS offset of the symbol. */ if (entry->tlsoff12) @@ -4761,7 +4760,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry, _frvfdpic_count_tls_entries (entry, dinfo, TRUE); changed = TRUE; } - + entry->tlsplt = entry->tlsoff12 = entry->tlsofflos = entry->tlsoffhilo = 0; } @@ -5245,7 +5244,7 @@ _frvfdpic_assign_plt_entries (void **entryp, void *info_) else size = 16; } - + frvfdpic_plt_section (dinfo->g.info)->size += size; } @@ -5833,7 +5832,7 @@ elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd, && (hend->type == bfd_link_hash_defined || hend->type == bfd_link_hash_defweak)) { - bfd_vma value = + bfd_vma value = frvfdpic_gotfixup_section (info)->output_section->vma + frvfdpic_gotfixup_section (info)->output_offset + frvfdpic_gotfixup_section (info)->size @@ -6276,7 +6275,7 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) case R_FRV_TLSDESC_VALUE: picrel->relocstlsd++; goto bad_reloc; - + case R_FRV_GOTTLSDESC12: picrel->tlsdesc12 = 1; break; @@ -6296,13 +6295,13 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) picrel->tlsoff12 = 1; info->flags |= DF_STATIC_TLS; break; - + case R_FRV_GOTTLSOFFHI: case R_FRV_GOTTLSOFFLO: picrel->tlsoffhilo = 1; info->flags |= DF_STATIC_TLS; break; - + case R_FRV_TLSOFF: picrel->relocstlsoff++; info->flags |= DF_STATIC_TLS; diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c index 3fba82b333..ddbe48f9f2 100644 --- a/bfd/elf32-i370.c +++ b/bfd/elf32-i370.c @@ -699,7 +699,7 @@ i370_elf_size_dynamic_sections (output_bfd, info) if (s->size == 0) { /* Strip this section if we don't need it; see the - comment below. */ + comment below. */ strip = TRUE; } else @@ -1022,20 +1022,16 @@ i370_elf_finish_dynamic_sections (output_bfd, info) } } - /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can - easily find the address of the _GLOBAL_OFFSET_TABLE_. */ -/* XXX this is clearly very wrong for the 370 arch */ if (sgot) { unsigned char *contents = sgot->contents; - bfd_put_32 (output_bfd, (bfd_vma) 0x4e800021 /* blrl */, contents); if (sdyn == NULL) - bfd_put_32 (output_bfd, (bfd_vma) 0, contents+4); + bfd_put_32 (output_bfd, (bfd_vma) 0, contents); else bfd_put_32 (output_bfd, sdyn->output_section->vma + sdyn->output_offset, - contents+4); + contents); elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; } @@ -1082,7 +1078,7 @@ i370_elf_finish_dynamic_sections (output_bfd, info) } /* Set the sh_info field of the output .dynsym section to the - index of the first global symbol. */ + index of the first global symbol. */ elf_section_data (sdynsym->output_section)->this_hdr.sh_info = maxdindx + 1; } @@ -1215,8 +1211,8 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, || r_type == R_I370_RELATIVE)) { /* In these cases, we don't need the relocation - value. We check specially because in some - obscure cases sec->output_section will be NULL. */ + value. We check specially because in some + obscure cases sec->output_section will be NULL. */ relocation = 0; } else @@ -1259,7 +1255,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, continue; /* Relocations that may need to be propagated if this is a shared - object. */ + object. */ case (int)R_I370_REL31: /* If these relocations are not to a named symbol, they can be handled right here, no need to bother the dynamic linker. */ @@ -1269,7 +1265,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, /* fall through */ /* Relocations that always need to be propagated if this is a shared - object. */ + object. */ case (int)R_I370_ADDR31: case (int)R_I370_ADDR16: if (info->shared @@ -1286,8 +1282,8 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, #endif /* When generating a shared object, these relocations - are copied into the output file to be resolved at run - time. */ + are copied into the output file to be resolved at run + time. */ if (sreloc == NULL) { @@ -1323,7 +1319,7 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, if (skip) memset (&outrel, 0, sizeof outrel); /* h->dynindx may be -1 if this symbol was marked to - become local. */ + become local. */ else if (h != NULL && ((! info->symbolic && h->dynindx != -1) || !h->def_regular)) @@ -1377,8 +1373,8 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section, bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); /* This reloc will be computed at runtime, so there's no - need to do anything now, unless this is a RELATIVE - reloc in an unallocated section. */ + need to do anything now, unless this is a RELATIVE + reloc in an unallocated section. */ if (skip == -1 || (input_section->flags & SEC_ALLOC) != 0 || ELF32_R_TYPE (outrel.r_info) != R_I370_RELATIVE) @@ -1487,7 +1483,6 @@ i370_elf_post_process_headers (abfd, link_info) #define elf_info_to_howto i370_elf_info_to_howto #define elf_backend_plt_not_loaded 1 -#define elf_backend_got_symbol_offset 4 #define elf_backend_rela_normal 1 #define bfd_elf32_bfd_reloc_type_lookup i370_elf_reloc_type_lookup diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 6287921fa0..d88d66c80e 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2131,6 +2131,11 @@ struct ppc_elf_link_hash_table bfd_vma offset; } tlsld_got; + /* Size of reserved GOT entries. */ + unsigned int got_header_size; + /* Non-zero if allocating the header left a gap. */ + unsigned int got_gap; + /* Small local sym to section mapping cache. */ struct sym_sec_cache sym_sec; }; @@ -2220,12 +2225,9 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info) if (!bfd_set_section_flags (abfd, s, flags)) return FALSE; - htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", - SEC_ALLOC | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_LINKER_CREATED - | SEC_READONLY); + flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY + | SEC_LINKER_CREATED | SEC_READONLY); + htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags); if (!htab->relgot || ! bfd_set_section_alignment (abfd, htab->relgot, 2)) return FALSE; @@ -2257,18 +2259,18 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) | SEC_LINKER_CREATED); htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss"); - htab->dynsbss = s = bfd_make_section_with_flags (abfd, ".dynsbss", - SEC_ALLOC - | SEC_LINKER_CREATED); + s = bfd_make_section_with_flags (abfd, ".dynsbss", + SEC_ALLOC | SEC_LINKER_CREATED); + htab->dynsbss = s; if (s == NULL) return FALSE; if (! info->shared) { htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss"); - htab->relsbss = s = bfd_make_section_with_flags (abfd, - ".rela.sbss", - flags | SEC_READONLY); + s = bfd_make_section_with_flags (abfd, ".rela.sbss", + flags | SEC_READONLY); + htab->relsbss = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, 2)) return FALSE; @@ -2279,7 +2281,7 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (s == NULL) abort (); - flags = SEC_ALLOC | SEC_CODE | SEC_IN_MEMORY | SEC_LINKER_CREATED; + flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED; return bfd_set_section_flags (abfd, s, flags); } @@ -2626,15 +2628,15 @@ ppc_elf_check_relocs (bfd *abfd, /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got. This shows up in particular in an R_PPC_ADDR32 in the eabi startup code. */ - if (h && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) + if (h != NULL + && htab->got == NULL + && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) { - if (htab->got == NULL) - { - if (htab->elf.dynobj == NULL) - htab->elf.dynobj = abfd; - if (!ppc_elf_create_got (htab->elf.dynobj, info)) - return FALSE; - } + if (htab->elf.dynobj == NULL) + htab->elf.dynobj = abfd; + if (!ppc_elf_create_got (htab->elf.dynobj, info)) + return FALSE; + BFD_ASSERT (h == htab->elf.hgot); } r_type = ELF32_R_TYPE (rel->r_info); @@ -2860,8 +2862,7 @@ ppc_elf_check_relocs (bfd *abfd, case R_PPC_REL14_BRTAKEN: case R_PPC_REL14_BRNTAKEN: case R_PPC_REL32: - if (h == NULL - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) + if (h == NULL || h == htab->elf.hgot) break; /* fall through */ @@ -3240,8 +3241,7 @@ ppc_elf_gc_sweep_hook (bfd *abfd, case R_PPC_REL14_BRTAKEN: case R_PPC_REL14_BRNTAKEN: case R_PPC_REL32: - if (h == NULL - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) + if (h == NULL || h == htab->elf.hgot) break; /* Fall thru */ @@ -3648,6 +3648,34 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, return TRUE; } +/* Allocate NEED contiguous space in .got, and return the offset. + Handles allocation of the got header when crossing 32k. */ + +static bfd_vma +allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need) +{ + bfd_vma where; + unsigned int max_before_header = 32764; + + if (need <= htab->got_gap) + { + where = max_before_header - htab->got_gap; + htab->got_gap -= need; + } + else + { + if (htab->got->size + need > max_before_header + && htab->got->size <= max_before_header) + { + htab->got_gap = max_before_header - htab->got->size; + htab->got->size = max_before_header + htab->got_header_size; + } + where = htab->got->size; + htab->got->size += need; + } + return where; +} + /* Allocate space in associated reloc sections for dynamic relocs. */ static bfd_boolean @@ -3749,33 +3777,32 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) else { bfd_boolean dyn; - eh->elf.got.offset = htab->got->size; + unsigned int need = 0; if ((eh->tls_mask & TLS_TLS) != 0) { if ((eh->tls_mask & TLS_LD) != 0) - htab->got->size += 8; + need += 8; if ((eh->tls_mask & TLS_GD) != 0) - htab->got->size += 8; + need += 8; if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0) - htab->got->size += 4; + need += 4; if ((eh->tls_mask & TLS_DTPREL) != 0) - htab->got->size += 4; + need += 4; } else - htab->got->size += 4; + need += 4; + eh->elf.got.offset = allocate_got (htab, need); dyn = htab->elf.dynamic_sections_created; if ((info->shared || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf)) && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT || eh->elf.root.type != bfd_link_hash_undefweak)) { - /* All the entries we allocated need relocs. */ - htab->relgot->size - += ((htab->got->size - eh->elf.got.offset) / 4 - * sizeof (Elf32_External_Rela)); - /* Except LD only needs one. */ + /* All the entries we allocated need relocs. + Except LD only needs one. */ if ((eh->tls_mask & TLS_LD) != 0) - htab->relgot->size -= sizeof (Elf32_External_Rela); + need -= 4; + htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4); } } } @@ -3932,15 +3959,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, } } - if (htab->tlsld_got.refcount > 0) - { - htab->tlsld_got.offset = htab->got->size; - htab->got->size += 8; - if (info->shared) - htab->relgot->size += sizeof (Elf32_External_Rela); - } - else - htab->tlsld_got.offset = (bfd_vma) -1; + htab->got_header_size = 16; /* Set up .got offsets for local syms, and space for local dynamic relocs. */ @@ -3951,7 +3970,6 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, char *lgot_masks; bfd_size_type locsymcount; Elf_Internal_Shdr *symtab_hdr; - asection *srel; if (!is_ppc_elf_target (ibfd->xvec)) continue; @@ -3993,8 +4011,6 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, locsymcount = symtab_hdr->sh_info; end_local_got = local_got + locsymcount; lgot_masks = (char *) end_local_got; - s = htab->got; - srel = htab->relgot; for (; local_got < end_local_got; ++local_got, ++lgot_masks) if (*local_got > 0) { @@ -4002,41 +4018,60 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { /* If just an LD reloc, we'll just use htab->tlsld_got.offset. */ - if (htab->tlsld_got.offset == (bfd_vma) -1) - { - htab->tlsld_got.offset = s->size; - s->size += 8; - if (info->shared) - srel->size += sizeof (Elf32_External_Rela); - } + htab->tlsld_got.refcount += 1; *local_got = (bfd_vma) -1; } else { - *local_got = s->size; + unsigned int need = 0; if ((*lgot_masks & TLS_TLS) != 0) { if ((*lgot_masks & TLS_GD) != 0) - s->size += 8; + need += 8; if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0) - s->size += 4; + need += 4; if ((*lgot_masks & TLS_DTPREL) != 0) - s->size += 4; + need += 4; } else - s->size += 4; + need += 4; + *local_got = allocate_got (htab, need); if (info->shared) - srel->size += ((s->size - *local_got) / 4 - * sizeof (Elf32_External_Rela)); + htab->relgot->size += (need + * (sizeof (Elf32_External_Rela) / 4)); } } else *local_got = (bfd_vma) -1; } + if (htab->tlsld_got.refcount > 0) + { + htab->tlsld_got.offset = allocate_got (htab, 8); + if (info->shared) + htab->relgot->size += sizeof (Elf32_External_Rela); + } + else + htab->tlsld_got.offset = (bfd_vma) -1; + /* Allocate space for global sym dynamic relocs. */ elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info); + if (htab->got != NULL) + { + unsigned int g_o_t = 32768; + + /* If we haven't allocated the header, do so now. */ + if (htab->got->size <= 32768) + { + g_o_t = htab->got->size; + htab->got->size += htab->got_header_size; + } + g_o_t += 4; + + htab->elf.hgot->root.u.def.value = g_o_t; + } + /* We've now determined the sizes of the various dynamic sections. Allocate memory for them. */ relocs = FALSE; @@ -5273,7 +5308,8 @@ ppc_elf_relocate_section (bfd *output_bfd, } } - relocation = htab->got->output_offset + off - 4; + relocation = htab->got->output_offset + off; + relocation -= htab->elf.hgot->root.u.def.value; /* Addends on got relocations don't make much sense. x+off@got is actually x@got+off, and since the got is @@ -5347,7 +5383,7 @@ ppc_elf_relocate_section (bfd *output_bfd, /* If these relocations are not to a named symbol, they can be handled right here, no need to bother the dynamic linker. */ if (SYMBOL_REFERENCES_LOCAL (info, h) - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) + || h == htab->elf.hgot) break; /* fall through */ @@ -5952,8 +5988,8 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, #endif /* Mark some specially defined symbols as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0 + if (h == htab->elf.hgot + || strcmp (h->root.root.string, "_DYNAMIC") == 0 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0) sym->st_shndx = SHN_ABS; @@ -6035,17 +6071,18 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can easily find the address of the _GLOBAL_OFFSET_TABLE_. */ - if (htab->got) + if (htab->got != NULL) { - unsigned char *contents = htab->got->contents; - bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents); + unsigned char *p = htab->got->contents; + bfd_vma val; - if (sdyn == NULL) - bfd_put_32 (output_bfd, 0, contents + 4); - else - bfd_put_32 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - contents + 4); + p += elf_hash_table (info)->hgot->root.u.def.value; + bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4); + + val = 0; + if (sdyn != NULL) + val = sdyn->output_section->vma + sdyn->output_offset; + bfd_put_32 (output_bfd, val, p); elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4; } @@ -6076,10 +6113,8 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, #endif #define elf_backend_plt_not_loaded 1 -#define elf_backend_got_symbol_offset 4 #define elf_backend_can_gc_sections 1 #define elf_backend_can_refcount 1 -#define elf_backend_got_header_size 12 #define elf_backend_rela_normal 1 #define bfd_elf32_mkobject ppc_elf_mkobject diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 0eaa754921..7ef6d1cdad 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -67,7 +67,6 @@ static bfd_vma opd_entry_value #define elf_backend_want_plt_sym 0 #define elf_backend_plt_alignment 3 #define elf_backend_plt_not_loaded 1 -#define elf_backend_got_symbol_offset 0 #define elf_backend_got_header_size 8 #define elf_backend_can_gc_sections 1 #define elf_backend_can_refcount 1 @@ -2709,7 +2708,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, long j; /* Trim duplicate syms, since we may have merged the normal and dynamic symbols. Actually, we only care about syms that have - different values, so trim any with the same value. */ + different values, so trim any with the same value. */ for (i = 1, j = 1; i < symcount; ++i) if (syms[i - 1]->value + syms[i - 1]->section->vma != syms[i]->value + syms[i]->section->vma) @@ -4769,7 +4768,7 @@ opd_entry_value (asection *opd_sec, if (!bfd_get_section_contents (opd_bfd, opd_sec, &val, offset, 8)) return (bfd_vma) -1; - + if (code_sec != NULL) { asection *sec, *likely = NULL; diff --git a/bfd/elflink.c b/bfd/elflink.c index abdf68dab8..506897b9d6 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -81,7 +81,7 @@ _bfd_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) bh = NULL; if (!(_bfd_generic_link_add_one_symbol (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - bed->got_symbol_offset, NULL, FALSE, bed->collect, &bh))) + 0, NULL, FALSE, bed->collect, &bh))) return FALSE; h = (struct elf_link_hash_entry *) bh; h->def_regular = 1; @@ -96,7 +96,7 @@ _bfd_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) } /* The first bit of the global offset table is the header. */ - s->size += bed->got_header_size + bed->got_symbol_offset; + s->size += bed->got_header_size; return TRUE; } @@ -920,7 +920,7 @@ _bfd_elf_merge_symbol (bfd *abfd, if (h->type == STT_TLS) { - ntbfd = abfd; + ntbfd = abfd; ntsec = sec; ntdef = newdef; tbfd = oldbfd; @@ -3591,7 +3591,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) else if (sec->kept_section) { /* Symbols from discarded section are undefined, and have - default visibility. */ + default visibility. */ sec = bfd_und_section_ptr; isym->st_shndx = SHN_UNDEF; isym->st_other = STV_DEFAULT @@ -7055,7 +7055,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd) bfd_set_error (bfd_error_bad_value); return FALSE; } - + while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; @@ -7663,7 +7663,7 @@ elf_fixup_link_order (bfd *abfd, asection *o) struct bfd_link_order **sections; asection *s; bfd_vma offset; - + seen_other = 0; seen_linkorder = 0; for (p = o->map_head.link_order; p != NULL; p = p->next) @@ -7695,11 +7695,11 @@ elf_fixup_link_order (bfd *abfd, asection *o) bfd_set_error (bfd_error_bad_value); return FALSE; } - + sections = (struct bfd_link_order **) xmalloc (seen_linkorder * sizeof (struct bfd_link_order *)); seen_linkorder = 0; - + for (p = o->map_head.link_order; p != NULL; p = p->next) { sections[seen_linkorder++] = p; @@ -9065,7 +9065,7 @@ elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, return TRUE; } - + /* Mark sections containing global symbols. This is called through elf_link_hash_traverse. */ @@ -9086,7 +9086,7 @@ elf_mark_used_section (struct elf_link_hash_entry *h, return TRUE; } - + /* Do mark and sweep of unused sections. */ bfd_boolean @@ -9156,7 +9156,7 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) { /* _bfd_elf_discard_section_eh_frame knows how to discard orphaned FDEs so don't mark sections referenced by the - EH frame section. */ + EH frame section. */ if (strcmp (o->name, ".eh_frame") == 0) o->gc_mark = 1; else if (!_bfd_elf_gc_mark (info, o, gc_mark_hook)) @@ -9753,7 +9753,7 @@ _bfd_elf_section_already_linked (bfd *abfd, struct bfd_section * sec) which we are really going to use. */ sec->output_section = bfd_abs_section_ptr; sec->kept_section = l->sec; - + if (flags & SEC_GROUP) { asection *first = elf_next_in_group (sec); @@ -9842,7 +9842,7 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); if (h != NULL && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak)) + || h->root.type == bfd_link_hash_undefweak)) bfd_elf_set_symbol (h, val); } diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 4dc25882c5..77b29cc785 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -72,9 +72,6 @@ #define bfd_elfNN_get_section_contents_in_window \ _bfd_generic_get_section_contents_in_window -#ifndef elf_backend_got_symbol_offset -#define elf_backend_got_symbol_offset (bfd_vma) 0 -#endif #ifndef elf_backend_can_refcount #define elf_backend_can_refcount 0 #endif @@ -527,7 +524,7 @@ static const struct elf_backend_data elfNN_bed = ELF_MACHINE_CODE, /* elf_machine_code */ ELF_MAXPAGESIZE, /* maxpagesize */ ELF_MINPAGESIZE, /* minpagesize */ - ELF_DYNAMIC_SEC_FLAGS, /* dynamic_sec_flags */ + ELF_DYNAMIC_SEC_FLAGS, /* dynamic_sec_flags */ elf_info_to_howto, elf_info_to_howto_rel, elf_backend_sym_is_global, @@ -592,7 +589,6 @@ static const struct elf_backend_data elfNN_bed = ELF_MACHINE_ALT2, &elf_backend_size_info, elf_backend_special_sections, - elf_backend_got_symbol_offset, elf_backend_got_header_size, elf_backend_collect, elf_backend_type_change_ok, diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 620ca5854d..a247538600 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,12 +1,21 @@ +2005-05-07 Alan Modra <amodra@bigpond.net.au> + + * ld-powerpc/tlsexe32.d: Update for changed got layout. + * ld-powerpc/tlsexe32.g: Likewise. + * ld-powerpc/tlsexe32.r: Likewise. + * ld-powerpc/tlsso32.d: Likewise. + * ld-powerpc/tlsso32.g: Likewise. + * ld-powerpc/tlsso32.r: Likewise. + 2005-05-06 Nick Clifton <nickc@redhat.com> - * Update the address and phone number of the FSF organization in + Update the address and phone number of the FSF organization in the GPL notices in the following files: - config/default.exp, ld-alpha/alpha.exp, ld-arm/arm-elf.exp, + * config/default.exp, ld-alpha/alpha.exp, ld-arm/arm-elf.exp, ld-auto-import/auto-import.exp, ld-bootstrap/bootstrap.exp, ld-cdtest/cdtest.exp, ld-checks/checks.exp, ld-cris/cris.exp, ld-crx/crx.exp, ld-cygwin/exe-export.exp, ld-d10v/d10v.exp, - ld-discard/discard.exp, ld-elf/elf.exp, ld-elf/exclude.exp, + ld-discard/discard.exp, ld-elf/elf.exp, ld-elf/exclude.exp, ld-elf/frame.exp, ld-elf/sec64k.exp, ld-elfcomm/elfcomm.exp, ld-elfvers/vers.exp, ld-elfvsb/elfvsb.exp, ld-elfweak/elfweak.exp, ld-fastcall/fastcall.exp, ld-frv/fdpic.exp, ld-frv/tls.exp, diff --git a/ld/testsuite/ld-powerpc/tlsexe32.d b/ld/testsuite/ld-powerpc/tlsexe32.d index 0df39d539b..73edfaab9e 100644 --- a/ld/testsuite/ld-powerpc/tlsexe32.d +++ b/ld/testsuite/ld-powerpc/tlsexe32.d @@ -9,9 +9,9 @@ Disassembly of section \.text: .* <_start>: -.*: 80 7f 00 0c lwz r3,12\(r31\) +.*: 80 7f ff f0 lwz r3,-16\(r31\) .*: 7c 63 12 14 add r3,r3,r2 -.*: 38 7f 00 10 addi r3,r31,16 +.*: 38 7f ff f4 addi r3,r31,-12 .*: 48 01 01 85 bl .*<__tls_get_addr@plt> .*: 3c 62 00 00 addis r3,r2,0 .*: 38 63 90 1c addi r3,r3,-28644 @@ -39,8 +39,9 @@ Disassembly of section \.text: .*: a9 49 90 18 lha r10,-28648\(r9\) Disassembly of section \.got: -.* <_GLOBAL_OFFSET_TABLE_-0x4>: +.* <_GLOBAL_OFFSET_TABLE_-0x10>: + \.\.\. .*: 4e 80 00 21 blrl + .* <_GLOBAL_OFFSET_TABLE_>: -.*: 01 81 02 d0 00 00 00 00 00 00 00 00 00 00 00 00 .* - \.\.\. +.*: 01 81 02 d0 00 00 00 00 00 00 00 00 .* diff --git a/ld/testsuite/ld-powerpc/tlsexe32.g b/ld/testsuite/ld-powerpc/tlsexe32.g index d68e601c83..d40378622f 100644 --- a/ld/testsuite/ld-powerpc/tlsexe32.g +++ b/ld/testsuite/ld-powerpc/tlsexe32.g @@ -7,5 +7,5 @@ .*: +file format elf32-powerpc Contents of section \.got: -.* 4e800021 018102d0 00000000 00000000 .* -.* 00000000 00000000 00000000 .* +.* 00000000 00000000 00000000 4e800021 .* +.* 018102d0 00000000 00000000 .* diff --git a/ld/testsuite/ld-powerpc/tlsexe32.r b/ld/testsuite/ld-powerpc/tlsexe32.r index 08c636f7c9..75be30ad68 100644 --- a/ld/testsuite/ld-powerpc/tlsexe32.r +++ b/ld/testsuite/ld-powerpc/tlsexe32.r @@ -52,8 +52,8 @@ Program Headers: Relocation section '\.rela\.dyn' at offset 0x220 contains 2 entries: Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend -01810380 +00000249 R_PPC_TPREL32 +00000000 +gd \+ 0 -01810384 +00000444 R_PPC_DTPMOD32 +00000000 +ld \+ 0 +01810370 +00000249 R_PPC_TPREL32 +00000000 +gd \+ 0 +01810374 +00000444 R_PPC_DTPMOD32 +00000000 +ld \+ 0 Relocation section '\.rela\.plt' at offset 0x238 contains 1 entries: Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend @@ -109,7 +109,7 @@ Symbol table '\.symtab' contains 40 entries: .*: 00000024 +0 TLS +GLOBAL DEFAULT +9 ld1 .*: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start .*: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata -.*: 01810374 +0 OBJECT +GLOBAL +HIDDEN +11 _GLOBAL_OFFSET_TABLE_ +.*: 01810380 +0 OBJECT +GLOBAL +HIDDEN +11 _GLOBAL_OFFSET_TABLE_ .*: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end .*: 0000001c +0 TLS +GLOBAL DEFAULT +9 gd0 .*: 0000002c +0 TLS +GLOBAL DEFAULT +9 ie0 diff --git a/ld/testsuite/ld-powerpc/tlsso32.d b/ld/testsuite/ld-powerpc/tlsso32.d index 65f47ccf86..7ca7341a3c 100644 --- a/ld/testsuite/ld-powerpc/tlsso32.d +++ b/ld/testsuite/ld-powerpc/tlsso32.d @@ -9,30 +9,30 @@ Disassembly of section \.text: .* <_start>: -.*: 38 7f 00 1c addi r3,r31,28 +.*: 38 7f ff e8 addi r3,r31,-24 .*: 48 00 00 01 bl .* -.*: 38 7f 00 0c addi r3,r31,12 +.*: 38 7f ff e0 addi r3,r31,-32 .*: 48 00 00 01 bl .* -.*: 38 7f 00 24 addi r3,r31,36 +.*: 38 7f ff f0 addi r3,r31,-16 .*: 48 01 01 95 bl .*<__tls_get_addr@plt> -.*: 38 7f 00 0c addi r3,r31,12 +.*: 38 7f ff e0 addi r3,r31,-32 .*: 48 01 01 8d bl .*<__tls_get_addr@plt> .*: 39 23 80 20 addi r9,r3,-32736 .*: 3d 23 00 00 addis r9,r3,0 .*: 81 49 80 24 lwz r10,-32732\(r9\) -.*: 81 3f 00 2c lwz r9,44\(r31\) +.*: 81 3f ff f8 lwz r9,-8\(r31\) .*: 7d 49 12 2e lhzx r10,r9,r2 .*: 89 42 00 00 lbz r10,0\(r2\) .*: 3d 22 00 00 addis r9,r2,0 .*: 99 49 00 00 stb r10,0\(r9\) -.*: 38 7e 00 14 addi r3,r30,20 +.*: 38 7e ff d8 addi r3,r30,-40 .*: 48 00 00 01 bl .* -.*: 38 7e 00 0c addi r3,r30,12 +.*: 38 7e ff e0 addi r3,r30,-32 .*: 48 00 00 01 bl .* .*: 91 43 80 04 stw r10,-32764\(r3\) .*: 3d 23 00 00 addis r9,r3,0 .*: 91 49 80 08 stw r10,-32760\(r9\) -.*: 81 3e 00 2c lwz r9,44\(r30\) +.*: 81 3e ff f8 lwz r9,-8\(r30\) .*: 7d 49 13 2e sthx r10,r9,r2 .*: a1 42 00 00 lhz r10,0\(r2\) .*: 3d 22 00 00 addis r9,r2,0 @@ -40,6 +40,7 @@ Disassembly of section \.text: Disassembly of section \.got: .* <\.got>: + \.\.\. .*: 4e 80 00 21 blrl .*: 00 01 04 90 .* \.\.\. diff --git a/ld/testsuite/ld-powerpc/tlsso32.g b/ld/testsuite/ld-powerpc/tlsso32.g index be18b324ae..e5bfc255d6 100644 --- a/ld/testsuite/ld-powerpc/tlsso32.g +++ b/ld/testsuite/ld-powerpc/tlsso32.g @@ -7,7 +7,7 @@ .*: +file format elf32-powerpc Contents of section \.got: -.* 4e800021 00010490 00000000 00000000 .* .* 00000000 00000000 00000000 00000000 .* .* 00000000 00000000 00000000 00000000 .* +.* 00000000 4e800021 00010490 00000000 .* .* 00000000 .* diff --git a/ld/testsuite/ld-powerpc/tlsso32.r b/ld/testsuite/ld-powerpc/tlsso32.r index f50ba6cd22..c90f919a57 100644 --- a/ld/testsuite/ld-powerpc/tlsso32.r +++ b/ld/testsuite/ld-powerpc/tlsso32.r @@ -55,14 +55,14 @@ Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 18 entries: 0+46a +0+245 R_PPC_TPREL16 +0+10474 +\.tdata \+ 10488 0+46e +0+248 R_PPC_TPREL16_HA +0+10474 +\.tdata \+ 1048c 0+472 +0+246 R_PPC_TPREL16_LO +0+10474 +\.tdata \+ 1048c -0+10540 +0+44 R_PPC_DTPMOD32 +0+ -0+10548 +0+44 R_PPC_DTPMOD32 +0+ -0+1054c +0+4e R_PPC_DTPREL32 +0+ -0+10550 +0+844 R_PPC_DTPMOD32 +0+ +gd \+ 0 -0+10554 +0+84e R_PPC_DTPREL32 +0+ +gd \+ 0 -0+10558 +0+1544 R_PPC_DTPMOD32 +0+1c +gd0 \+ 0 -0+1055c +0+154e R_PPC_DTPREL32 +0+1c +gd0 \+ 0 -0+10560 +0+1649 R_PPC_TPREL32 +0+2c +ie0 \+ 0 +0+10530 +0+44 R_PPC_DTPMOD32 +0+ +0+10534 +0+4e R_PPC_DTPREL32 +0+ +0+10538 +0+44 R_PPC_DTPMOD32 +0+ +0+10540 +0+844 R_PPC_DTPMOD32 +0+ +gd \+ 0 +0+10544 +0+84e R_PPC_DTPREL32 +0+ +gd \+ 0 +0+10548 +0+1544 R_PPC_DTPMOD32 +0+1c +gd0 \+ 0 +0+1054c +0+154e R_PPC_DTPREL32 +0+1c +gd0 \+ 0 +0+10550 +0+1649 R_PPC_TPREL32 +0+2c +ie0 \+ 0 Relocation section '\.rela\.plt' at offset 0x[0-9a-f]+ contains 1 entries: Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend @@ -118,7 +118,7 @@ Symbol table '\.symtab' contains 39 entries: +[0-9]+: 0+10 +0 TLS +LOCAL +DEFAULT +7 ie4 +[0-9]+: 0+14 +0 TLS +LOCAL +DEFAULT +7 le4 +[0-9]+: 0+18 +0 TLS +LOCAL +DEFAULT +7 le5 - +[0-9]+: 0+10534 +0 OBJECT +LOCAL +HIDDEN +ABS _GLOBAL_OFFSET_TABLE_ + +[0-9]+: 0+10558 +0 OBJECT +LOCAL +HIDDEN +ABS _GLOBAL_OFFSET_TABLE_ +[0-9]+: 0+10490 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT +UND gd +[0-9]+: 0+30 +0 TLS +GLOBAL DEFAULT +8 le0 |