* elf64-ppc.c (follow_link, elf_follow_link, ppc_follow_link): New
	functions.  Use throughout.
	(ppc64_elf_copy_indirect_symbol): Set direct symbol "oh" field
	from indirect symbol.
	(lookup_fdh): Rename from get_fdh.  Follow indirect sym links.
	(add_symbol_adjust): Simplify.
	(defined_code_entry, defined_func_desc): New functions.
	(ppc64_elf_gc_keep): Follow indirect sym links.  Use defined_code_entry.
	(ppc64_elf_gc_mark_dynamic_ref): Use defined_func_desc and
	defined_code_entry to follow indirect sym links.
	(ppc64_elf_gc_mark_hook, func_desc_adjust): Likewise.
	(ppc_type_of_stub): Follow indirect sym links.
	(toc_adjusting_stub_needed): Likewise.
	(ppc_build_one_stub): Likewise.  Make undefined dot-symbols weak
	rather than defining them at stub.
	(ppc64_elf_relocate_section): Rewrite call test to avoid multiple
	assignments in test.
ld/testsuite/
	* ld-powerpc/tlsso.d: Update.
	* ld-powerpc/tlsso.r: Update.
	* ld-powerpc/tlstocso.d: Update.
	* ld-powerpc/tlstocso.r: Update.
This commit is contained in:
Alan Modra 2009-09-18 03:30:34 +00:00
parent 20e6d0d602
commit b31867b61a
7 changed files with 187 additions and 119 deletions

View file

@ -1,3 +1,23 @@
2009-09-18 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (follow_link, elf_follow_link, ppc_follow_link): New
functions. Use throughout.
(ppc64_elf_copy_indirect_symbol): Set direct symbol "oh" field
from indirect symbol.
(lookup_fdh): Rename from get_fdh. Follow indirect sym links.
(add_symbol_adjust): Simplify.
(defined_code_entry, defined_func_desc): New functions.
(ppc64_elf_gc_keep): Follow indirect sym links. Use defined_code_entry.
(ppc64_elf_gc_mark_dynamic_ref): Use defined_func_desc and
defined_code_entry to follow indirect sym links.
(ppc64_elf_gc_mark_hook, func_desc_adjust): Likewise.
(ppc_type_of_stub): Follow indirect sym links.
(toc_adjusting_stub_needed): Likewise.
(ppc_build_one_stub): Likewise. Make undefined dot-symbols weak
rather than defining them at stub.
(ppc64_elf_relocate_section): Rewrite call test to avoid multiple
assignments in test.
2009-09-16 Tristan Gingold <gingold@adacore.com>
* mach-o.h (bfd_mach_o_filetype): Add new constants from darwin10.

View file

@ -4282,6 +4282,29 @@ ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
return TRUE;
}
/* Follow indirect and warning symbol links. */
static inline struct bfd_link_hash_entry *
follow_link (struct bfd_link_hash_entry *h)
{
while (h->type == bfd_link_hash_indirect
|| h->type == bfd_link_hash_warning)
h = h->u.i.link;
return h;
}
static inline struct elf_link_hash_entry *
elf_follow_link (struct elf_link_hash_entry *h)
{
return (struct elf_link_hash_entry *) follow_link (&h->root);
}
static inline struct ppc_link_hash_entry *
ppc_follow_link (struct ppc_link_hash_entry *h)
{
return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
}
/* Merge PLT info on FROM with that on TO. */
static void
@ -4364,6 +4387,8 @@ ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
edir->is_func |= eind->is_func;
edir->is_func_descriptor |= eind->is_func_descriptor;
edir->tls_mask |= eind->tls_mask;
if (eind->oh != NULL)
edir->oh = ppc_follow_link (eind->oh);
/* If called to transfer flags for a weakdef during processing
of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
@ -4433,7 +4458,7 @@ ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
hash entry FH. Link the entries via their OH fields. */
static struct ppc_link_hash_entry *
get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
{
struct ppc_link_hash_entry *fdh = fh->oh;
@ -4443,16 +4468,16 @@ get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
fdh = (struct ppc_link_hash_entry *)
elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
if (fdh != NULL)
{
fdh->is_func_descriptor = 1;
fdh->oh = fh;
fh->is_func = 1;
fh->oh = fdh;
}
if (fdh == NULL)
return fdh;
fdh->is_func_descriptor = 1;
fdh->oh = fh;
fh->is_func = 1;
fh->oh = fdh;
}
return fdh;
return ppc_follow_link (fdh);
}
/* Make a fake function descriptor sym for the code sym FH. */
@ -4574,23 +4599,24 @@ add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
abort ();
htab = ppc_hash_table (info);
fdh = get_fdh (eh, htab);
if (fdh == NULL
&& !info->relocatable
&& (eh->elf.root.type == bfd_link_hash_undefined
|| eh->elf.root.type == bfd_link_hash_undefweak)
&& eh->elf.ref_regular)
fdh = lookup_fdh (eh, htab);
if (fdh == NULL)
{
/* Make an undefweak function descriptor sym, which is enough to
pull in an --as-needed shared lib, but won't cause link
errors. Archives are handled elsewhere. */
fdh = make_fdh (info, eh);
if (fdh == NULL)
return FALSE;
else
fdh->elf.ref_regular = 1;
if (!info->relocatable
&& (eh->elf.root.type == bfd_link_hash_undefined
|| eh->elf.root.type == bfd_link_hash_undefweak)
&& eh->elf.ref_regular)
{
/* Make an undefweak function descriptor sym, which is enough to
pull in an --as-needed shared lib, but won't cause link
errors. Archives are handled elsewhere. */
fdh = make_fdh (info, eh);
if (fdh == NULL)
return FALSE;
fdh->elf.ref_regular = 1;
}
}
else if (fdh != NULL)
else
{
unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
@ -4839,9 +4865,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
else
{
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
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;
h = elf_follow_link (h);
}
tls_type = 0;
@ -5199,7 +5223,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
{
if (h->root.root.string[0] == '.'
&& h->root.root.string[1] != 0
&& get_fdh ((struct ppc_link_hash_entry *) h, htab))
&& lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
;
else
((struct ppc_link_hash_entry *) h)->is_func = 1;
@ -5452,9 +5476,7 @@ opd_entry_value (asection *opd_sec,
sym_hashes = elf_sym_hashes (opd_bfd);
rh = sym_hashes[symndx - symtab_hdr->sh_info];
while (rh->root.type == bfd_link_hash_indirect
|| rh->root.type == bfd_link_hash_warning)
rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
rh = elf_follow_link (rh);
BFD_ASSERT (rh->root.type == bfd_link_hash_defined
|| rh->root.type == bfd_link_hash_defweak);
val = rh->root.u.def.value;
@ -5475,6 +5497,39 @@ opd_entry_value (asection *opd_sec,
return val;
}
/* If FDH is a function descriptor symbol, return the associated code
entry symbol if it is defined. Return NULL otherwise. */
static struct ppc_link_hash_entry *
defined_code_entry (struct ppc_link_hash_entry *fdh)
{
if (fdh->is_func_descriptor)
{
struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
if (fh->elf.root.type == bfd_link_hash_defined
|| fh->elf.root.type == bfd_link_hash_defweak)
return fh;
}
return NULL;
}
/* If FH is a function code entry symbol, return the associated
function descriptor symbol if it is defined. Return NULL otherwise. */
static struct ppc_link_hash_entry *
defined_func_desc (struct ppc_link_hash_entry *fh)
{
if (fh->oh != NULL
&& fh->oh->is_func_descriptor)
{
struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
if (fdh->elf.root.type == bfd_link_hash_defined
|| fdh->elf.root.type == bfd_link_hash_defweak)
return fdh;
}
return NULL;
}
/* Mark all our entry sym sections, both opd and code section. */
static void
@ -5485,22 +5540,21 @@ ppc64_elf_gc_keep (struct bfd_link_info *info)
for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
{
struct ppc_link_hash_entry *eh;
struct ppc_link_hash_entry *eh, *fh;
asection *sec;
eh = (struct ppc_link_hash_entry *)
elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
if (eh == NULL)
continue;
if (eh->elf.root.type != bfd_link_hash_defined
&& eh->elf.root.type != bfd_link_hash_defweak)
continue;
if (eh->is_func_descriptor
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
fh = defined_code_entry (eh);
if (fh != NULL)
{
sec = eh->oh->elf.root.u.def.section;
sec = fh->elf.root.u.def.section;
sec->flags |= SEC_KEEP;
}
else if (get_opd_info (eh->elf.root.u.def.section) != NULL
@ -5523,16 +5577,15 @@ ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
{
struct bfd_link_info *info = (struct bfd_link_info *) inf;
struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
struct ppc_link_hash_entry *fdh;
if (eh->elf.root.type == bfd_link_hash_warning)
eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
/* Dynamic linking info is on the func descriptor sym. */
if (eh->oh != NULL
&& eh->oh->is_func_descriptor
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
eh = eh->oh;
fdh = defined_func_desc (eh);
if (fdh != NULL)
eh = fdh;
if ((eh->elf.root.type == bfd_link_hash_defined
|| eh->elf.root.type == bfd_link_hash_defweak)
@ -5543,15 +5596,18 @@ ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
&& ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN)))
{
asection *code_sec;
struct ppc_link_hash_entry *fh;
eh->elf.root.u.def.section->flags |= SEC_KEEP;
/* Function descriptor syms cause the associated
function code sym section to be marked. */
if (eh->is_func_descriptor
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
eh->oh->elf.root.u.def.section->flags |= SEC_KEEP;
fh = defined_code_entry (eh);
if (fh != NULL)
{
code_sec = fh->elf.root.u.def.section;
code_sec->flags |= SEC_KEEP;
}
else if (get_opd_info (eh->elf.root.u.def.section) != NULL
&& opd_entry_value (eh->elf.root.u.def.section,
eh->elf.root.u.def.value,
@ -5583,7 +5639,7 @@ ppc64_elf_gc_mark_hook (asection *sec,
if (h != NULL)
{
enum elf_ppc64_reloc_type r_type;
struct ppc_link_hash_entry *eh;
struct ppc_link_hash_entry *eh, *fh, *fdh;
r_type = ELF64_R_TYPE (rel->r_info);
switch (r_type)
@ -5598,22 +5654,19 @@ ppc64_elf_gc_mark_hook (asection *sec,
case bfd_link_hash_defined:
case bfd_link_hash_defweak:
eh = (struct ppc_link_hash_entry *) h;
if (eh->oh != NULL
&& eh->oh->is_func_descriptor
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
eh = eh->oh;
fdh = defined_func_desc (eh);
if (fdh != NULL)
eh = fdh;
/* Function descriptor syms cause the associated
function code sym section to be marked. */
if (eh->is_func_descriptor
&& (eh->oh->elf.root.type == bfd_link_hash_defined
|| eh->oh->elf.root.type == bfd_link_hash_defweak))
fh = defined_code_entry (eh);
if (fh != NULL)
{
/* They also mark their opd section. */
eh->elf.root.u.def.section->gc_mark = 1;
rsec = eh->oh->elf.root.u.def.section;
rsec = fh->elf.root.u.def.section;
}
else if (get_opd_info (eh->elf.root.u.def.section) != NULL
&& opd_entry_value (eh->elf.root.u.def.section,
@ -5693,9 +5746,7 @@ ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
struct ppc_dyn_relocs *p;
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
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;
h = elf_follow_link (h);
eh = (struct ppc_link_hash_entry *) h;
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
@ -6081,18 +6132,17 @@ func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
in dynamic objects are handled elsewhere. */
if (fh->elf.root.type == bfd_link_hash_undefweak
&& fh->was_undefined
&& (fh->oh->elf.root.type == bfd_link_hash_defined
|| fh->oh->elf.root.type == bfd_link_hash_defweak)
&& get_opd_info (fh->oh->elf.root.u.def.section) != NULL
&& opd_entry_value (fh->oh->elf.root.u.def.section,
fh->oh->elf.root.u.def.value,
&& (fdh = defined_func_desc (fh)) != NULL
&& get_opd_info (fdh->elf.root.u.def.section) != NULL
&& opd_entry_value (fdh->elf.root.u.def.section,
fdh->elf.root.u.def.value,
&fh->elf.root.u.def.section,
&fh->elf.root.u.def.value) != (bfd_vma) -1)
{
fh->elf.root.type = fh->oh->elf.root.type;
fh->elf.root.type = fdh->elf.root.type;
fh->elf.forced_local = 1;
fh->elf.def_regular = fh->oh->elf.def_regular;
fh->elf.def_dynamic = fh->oh->elf.def_dynamic;
fh->elf.def_regular = fdh->elf.def_regular;
fh->elf.def_dynamic = fdh->elf.def_dynamic;
}
/* If this is a function code symbol, transfer dynamic linking
@ -6111,12 +6161,7 @@ func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
/* Find the corresponding function descriptor symbol. Create it
as undefined if necessary. */
fdh = get_fdh (fh, htab);
if (fdh != NULL)
while (fdh->elf.root.type == bfd_link_hash_indirect
|| fdh->elf.root.type == bfd_link_hash_warning)
fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
fdh = lookup_fdh (fh, htab);
if (fdh == NULL
&& !info->executable
&& (fh->elf.root.type == bfd_link_hash_undefined
@ -6454,9 +6499,7 @@ get_sym_h (struct elf_link_hash_entry **hp,
struct elf_link_hash_entry *h;
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
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;
h = elf_follow_link (h);
if (hp != NULL)
*hp = h;
@ -7024,8 +7067,8 @@ ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
if (h != NULL
&& h->root.root.string[0] == '.')
{
fdh = get_fdh ((struct ppc_link_hash_entry *) h,
ppc_hash_table (info));
fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
ppc_hash_table (info));
if (fdh != NULL
&& fdh->elf.root.type != bfd_link_hash_defined
&& fdh->elf.root.type != bfd_link_hash_defweak)
@ -7208,9 +7251,7 @@ branch_reloc_hash_match (const bfd *ibfd,
struct elf_link_hash_entry *h;
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
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;
h = elf_follow_link (h);
if (h == &hash1->elf || h == &hash2->elf)
return TRUE;
}
@ -8668,9 +8709,9 @@ ppc_type_of_stub (asection *input_sec,
{
struct plt_entry *ent;
struct ppc_link_hash_entry *fdh = h;
if (fdh->oh != NULL
&& fdh->oh->is_func_descriptor)
fdh = fdh->oh;
if (h->oh != NULL
&& h->oh->is_func_descriptor)
fdh = ppc_follow_link (h->oh);
for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
if (ent->addend == rel->r_addend
@ -8944,7 +8985,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
hashes[symndx] = &h->elf;
r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
if (h->oh != NULL && h->oh->is_func)
h = h->oh;
h = ppc_follow_link (h->oh);
if (h->elf.root.u.def.section != stub_entry->target_section)
/* H is an opd symbol. The addend must be zero. */
r->r_addend = 0;
@ -9109,22 +9150,20 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
break;
case ppc_stub_plt_call:
/* Do the best we can for shared libraries built without
exporting ".foo" for each "foo". This can happen when symbol
versioning scripts strip all bar a subset of symbols. */
if (stub_entry->h != NULL
&& stub_entry->h->oh != NULL
&& stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
&& stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
&& stub_entry->h->is_func_descriptor
&& stub_entry->h->oh != NULL)
{
/* Point the symbol at the stub. There may be multiple stubs,
we don't really care; The main thing is to make this sym
defined somewhere. Maybe defining the symbol in the stub
section is a silly idea. If we didn't do this, htab->top_id
could disappear. */
stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
/* If the old-ABI "dot-symbol" is undefined make it weak so
we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
FIXME: We used to define the symbol on one of the call
stubs instead, which is why we test symbol section id
against htab->top_id in various places. Likely all
these checks could now disappear. */
if (fh->elf.root.type == bfd_link_hash_undefined)
fh->elf.root.type = bfd_link_hash_undefweak;
}
/* Now build the stub. */
@ -9561,7 +9600,7 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
if (eh != NULL
&& (eh->elf.plt.plist != NULL
|| (eh->oh != NULL
&& eh->oh->elf.plt.plist != NULL)))
&& ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
{
ret = 1;
break;
@ -10000,7 +10039,7 @@ ppc64_elf_size_stubs (bfd *output_bfd,
use the func descriptor sym instead if it is
defined. */
if (hash->elf.root.root.string[0] == '.'
&& (fdh = get_fdh (hash, htab)) != NULL)
&& (fdh = lookup_fdh (hash, htab)) != NULL)
{
if (fdh->elf.root.type == bfd_link_hash_defined
|| fdh->elf.root.type == bfd_link_hash_defweak)
@ -11188,10 +11227,12 @@ ppc64_elf_relocate_section (bfd *output_bfd,
base pointer. */
stub_entry = NULL;
fdh = h;
if (((h != NULL
&& (((fdh = h->oh) != NULL
&& fdh->elf.plt.plist != NULL)
|| (fdh = h)->elf.plt.plist != NULL))
if (h != NULL
&& h->oh != NULL
&& h->oh->is_func_descriptor)
fdh = ppc_follow_link (h->oh);
if (((fdh != NULL
&& fdh->elf.plt.plist != NULL)
|| (sec != NULL
&& sec->output_section != NULL
&& sec->id <= htab->top_id

View file

@ -1,3 +1,10 @@
2009-09-18 Alan Modra <amodra@bigpond.net.au>
* ld-powerpc/tlsso.d: Update.
* ld-powerpc/tlsso.r: Update.
* ld-powerpc/tlstocso.d: Update.
* ld-powerpc/tlstocso.r: Update.
2009-09-15 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* ld-elfcomm/elfcomm.exp: Add appropriate emulation option

View file

@ -8,7 +8,7 @@
Disassembly of section \.text:
.* <\.__tls_get_addr>:
.*:
.* f8 41 00 28 std r2,40\(r1\)
.* e9 62 80 78 ld r11,-32648\(r2\)
.* 7d 69 03 a6 mtctr r11
@ -18,16 +18,16 @@ Disassembly of section \.text:
.* <_start>:
.* 38 62 80 20 addi r3,r2,-32736
.* 4b ff ff e5 bl .* <\.__tls_get_addr>
.* 4b ff ff e5 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 50 addi r3,r2,-32688
.* 4b ff ff d9 bl .* <\.__tls_get_addr>
.* 4b ff ff d9 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 38 addi r3,r2,-32712
.* 4b ff ff cd bl .* <\.__tls_get_addr>
.* 4b ff ff cd bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 50 addi r3,r2,-32688
.* 4b ff ff c1 bl .* <\.__tls_get_addr>
.* 4b ff ff c1 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 39 23 80 40 addi r9,r3,-32704
.* 3d 23 00 00 addis r9,r3,0
@ -40,10 +40,10 @@ Disassembly of section \.text:
.* 3d 2d 00 00 addis r9,r13,0
.* 99 49 00 00 stb r10,0\(r9\)
.* 38 62 80 08 addi r3,r2,-32760
.* 4b ff ff 8d bl .* <\.__tls_get_addr>
.* 4b ff ff 8d bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 50 addi r3,r2,-32688
.* 4b ff ff 81 bl .* <\.__tls_get_addr>
.* 4b ff ff 81 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* f9 43 80 08 std r10,-32760\(r3\)
.* 3d 23 00 00 addis r9,r3,0

View file

@ -110,7 +110,7 @@ Symbol table '\.symtab' contains [0-9]+ entries:
.* TLS +LOCAL +DEFAULT +7 le4
.* TLS +LOCAL +DEFAULT +7 le5
.* OBJECT +LOCAL +HIDDEN +ABS _DYNAMIC
.* NOTYPE +LOCAL +DEFAULT +6 \.__tls_get_addr
.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
.* TLS +GLOBAL DEFAULT +UND gd
.* TLS +GLOBAL DEFAULT +8 le0
.* NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr

View file

@ -8,7 +8,7 @@
Disassembly of section \.text:
.* <\.__tls_get_addr>:
.*:
.* f8 41 00 28 std r2,40\(r1\)
.* e9 62 80 70 ld r11,-32656\(r2\)
.* 7d 69 03 a6 mtctr r11
@ -18,16 +18,16 @@ Disassembly of section \.text:
.* <_start>:
.* 38 62 80 08 addi r3,r2,-32760
.* 4b ff ff e5 bl .* <\.__tls_get_addr>
.* 4b ff ff e5 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 18 addi r3,r2,-32744
.* 4b ff ff d9 bl .* <\.__tls_get_addr>
.* 4b ff ff d9 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 28 addi r3,r2,-32728
.* 4b ff ff cd bl .* <\.__tls_get_addr>
.* 4b ff ff cd bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 38 62 80 38 addi r3,r2,-32712
.* 4b ff ff c1 bl .* <\.__tls_get_addr>
.* 4b ff ff c1 bl .*
.* e8 41 00 28 ld r2,40\(r1\)
.* 39 23 80 40 addi r9,r3,-32704
.* 3d 23 00 00 addis r9,r3,0

View file

@ -106,7 +106,7 @@ Symbol table '\.symtab' contains [0-9]+ entries:
.* TLS +LOCAL +DEFAULT +7 le5
.* NOTYPE +LOCAL +DEFAULT +11 \.Lie0
.* OBJECT +LOCAL +HIDDEN +ABS _DYNAMIC
.* NOTYPE +LOCAL +DEFAULT +6 \.__tls_get_addr
.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
.* TLS +GLOBAL DEFAULT +UND gd
.* TLS +GLOBAL DEFAULT +8 le0
.* NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr