2007-09-18  Richard Sandiford  <richard@codesourcery.com>

	* elfxx-mips.c (mips_got_page_range): New structure.
	(mips_got_page_entry): Likewise.
	(mips_got_info): Add page_gotno and got_page_entries fields.
	(mips_elf_got_per_bfd_arg): Add max_pages field.  Delete
	primary_count and current_count fields.
	(mips_got_page_entry_hash, mips_got_page_entry_eq): New functions.
	(mips_elf_pages_for_range, mips_elf_record_got_page_entry): Likewise.
	(mips_elf_get_got_for_bfd): New function, split out from
	mips_elf_make_got_per_bfd.  Initialize the page_gotno and
	got_page_entries fields when creating a new GOT structure.
	(mips_elf_make_got_pages_per_bfd): New function.
	(mips_elf_merge_got_with): New function, split out from
	mips_elf_make_got_per_bfd.  Merge page entries as well as
	non-page entries.  Use the minimum of max_pages and the sum
	of the page_gotnos to estimate the number of page entries.
	(mips_elf_merge_gots): Use the minimum of max_pages and the
	bfd's page_gotno to estimate the number of page entries.
	Use the above functions.
	(mips_elf_multi_got): Add page entries as well as non-page entries
	to the individual per-bfd GOTs.  Initialize got_per_bfd_arg.max_pages.
	Initialize the page_gotno and got_page_entries fields when creating
	a new primary GOT.  Use the minimum of pages and page_gotno when
	adding the number of pages entries to local_gotno.
	(mips_elf_create_got_section): Initialize the page_gotno and
	got_page_entries fields of the GOT structure.
	(mips_elf_rel_relocation_p, mips_elf_read_rel_addend)
	(mips_elf_add_lo16_rel_addend, mips_elf_get_section_contents): New
	functions, split out from...
	(_bfd_mips_elf_relocate_section): ...here.
	(_bfd_mips_elf_check_relocs): Record GOT page entries too.
	(_bfd_mips_relax_section): Use mips_elf_get_section_contents.
	(_bfd_mips_elf_always_size_sections): Use the smaller of the
	loadable_size- and page_gotno-derived estimates.

ld/testsuite/
2007-09-18  Richard Sandiford  <richard@codesourcery.com>
            Joseph Myers  <joseph@codesourcery.com>

	* ld-mips-elf/got-page-1.d, ld-mips-elf/got-page-1.s,
	* ld-mips-elf/got-page-2.d, ld-mips-elf/got-page-2.s,
	* ld-mips-elf/got-page-3.d, ld-mips-elf/got-page-3a.s,
	* ld-mips-elf/got-page-3b.s, ld-mips-elf/got-page-3c.s,
	* ld-mips-elf/got-page-1.ld: New tests.
	* ld-mips-elf/mips-elf.exp: Run them.
	* ld-mips-elf/multi-got-1.d, ld-mips-elf/multi-got-no-shared.d,
	* ld-mips-elf/tls-hidden2-got.d, ld-mips-elf/tls-hidden2.d,
	* ld-mips-elf/tls-hidden3.d, ld-mips-elf/tls-hidden3.got,
	* ld-mips-elf/tls-hidden3.r, ld-mips-elf/tls-hidden4.got,
	* ld-mips-elf/tls-hidden4.r, ld-mips-elf/tls-multi-got-1.d,
	* ld-mips-elf/tls-multi-got-1.got, ld-mips-elf/tls-multi-got-1.r,
	* ld-mips-elf/tlsbin-o32.d, ld-mips-elf/tlsbin-o32.got,
	* ld-mips-elf/tlsdyn-o32-1.d, ld-mips-elf/tlsdyn-o32-1.got,
	* ld-mips-elf/tlsdyn-o32-2.d, ld-mips-elf/tlsdyn-o32-2.got,
	* ld-mips-elf/tlsdyn-o32-3.d, ld-mips-elf/tlsdyn-o32-3.got,
	* ld-mips-elf/tlsdyn-o32.d, ld-mips-elf/tlsdyn-o32.got,
	* ld-mips-elf/tlslib-o32-hidden.got, ld-mips-elf/tlslib-o32-ver.got,
	* ld-mips-elf/tlslib-o32.d, ld-mips-elf/tlslib-o32.got: Update for
	GOT allocation changes.
This commit is contained in:
Richard Sandiford 2007-11-14 20:46:15 +00:00
parent 51a0dd312e
commit c224138d88
39 changed files with 1063 additions and 492 deletions

View file

@ -1,3 +1,39 @@
2007-11-14 Richard Sandiford <richard@codesourcery.com>
* elfxx-mips.c (mips_got_page_range): New structure.
(mips_got_page_entry): Likewise.
(mips_got_info): Add page_gotno and got_page_entries fields.
(mips_elf_got_per_bfd_arg): Add max_pages field. Delete
primary_count and current_count fields.
(mips_got_page_entry_hash, mips_got_page_entry_eq): New functions.
(mips_elf_pages_for_range, mips_elf_record_got_page_entry): Likewise.
(mips_elf_get_got_for_bfd): New function, split out from
mips_elf_make_got_per_bfd. Initialize the page_gotno and
got_page_entries fields when creating a new GOT structure.
(mips_elf_make_got_pages_per_bfd): New function.
(mips_elf_merge_got_with): New function, split out from
mips_elf_make_got_per_bfd. Merge page entries as well as
non-page entries. Use the minimum of max_pages and the sum
of the page_gotnos to estimate the number of page entries.
(mips_elf_merge_gots): Use the minimum of max_pages and the
bfd's page_gotno to estimate the number of page entries.
Use the above functions.
(mips_elf_multi_got): Add page entries as well as non-page entries
to the individual per-bfd GOTs. Initialize got_per_bfd_arg.max_pages.
Initialize the page_gotno and got_page_entries fields when creating
a new primary GOT. Use the minimum of pages and page_gotno when
adding the number of pages entries to local_gotno.
(mips_elf_create_got_section): Initialize the page_gotno and
got_page_entries fields of the GOT structure.
(mips_elf_rel_relocation_p, mips_elf_read_rel_addend)
(mips_elf_add_lo16_rel_addend, mips_elf_get_section_contents): New
functions, split out from...
(_bfd_mips_elf_relocate_section): ...here.
(_bfd_mips_elf_check_relocs): Record GOT page entries too.
(_bfd_mips_relax_section): Use mips_elf_get_section_contents.
(_bfd_mips_elf_always_size_sections): Use the smaller of the
loadable_size- and page_gotno-derived estimates.
2007-11-14 Thiemo Seufer <ths@mips.com>
* elfxx-mips.c (mips_elf_merge_obj_attributes): Prevent

View file

@ -112,6 +112,30 @@ struct mips_got_entry
long gotidx;
};
/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
The structures form a non-overlapping list that is sorted by increasing
MIN_ADDEND. */
struct mips_got_page_range
{
struct mips_got_page_range *next;
bfd_signed_vma min_addend;
bfd_signed_vma max_addend;
};
/* This structure describes the range of addends that are applied to page
relocations against a given symbol. */
struct mips_got_page_entry
{
/* The input bfd in which the symbol is defined. */
bfd *abfd;
/* The index of the symbol, as stored in the relocation r_info. */
long symndx;
/* The ranges for this page entry. */
struct mips_got_page_range *ranges;
/* The maximum number of page entries needed for RANGES. */
bfd_vma num_pages;
};
/* This structure is used to hold .got information when linking. */
struct mips_got_info
@ -126,12 +150,16 @@ struct mips_got_info
/* The first unused TLS .got entry. Used only during
mips_elf_initialize_tls_index. */
unsigned int tls_assigned_gotno;
/* The number of local .got entries. */
/* The number of local .got entries, eventually including page entries. */
unsigned int local_gotno;
/* The maximum number of page entries needed. */
unsigned int page_gotno;
/* The number of local .got entries we have used. */
unsigned int assigned_gotno;
/* A hash table holding members of the got. */
struct htab *got_entries;
/* A hash table of mips_got_page_entry structures. */
struct htab *got_page_entries;
/* A hash table mapping input bfds to other mips_got_info. NULL
unless multi-got was necessary. */
struct htab *bfd2got;
@ -173,10 +201,8 @@ struct mips_elf_got_per_bfd_arg
/* The maximum number of got entries that can be addressed with a
16-bit offset. */
unsigned int max_count;
/* The number of local and global entries in the primary got. */
unsigned int primary_count;
/* The number of local and global entries in the current got. */
unsigned int current_count;
/* The maximum number of page entries needed by each got. */
unsigned int max_pages;
/* The total number of global entries which will live in the
primary got and be automatically relocated. This includes
those not referenced by the primary GOT but included in
@ -2039,6 +2065,25 @@ mips_elf_multi_got_entry_eq (const void *entry1, const void *entry2)
? e1->abfd == e2->abfd && e1->d.address == e2->d.address
: e1->d.h == e2->d.h);
}
static hashval_t
mips_got_page_entry_hash (const void *entry_)
{
const struct mips_got_page_entry *entry;
entry = (const struct mips_got_page_entry *) entry_;
return entry->abfd->id + entry->symndx;
}
static int
mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
{
const struct mips_got_page_entry *entry1, *entry2;
entry1 = (const struct mips_got_page_entry *) entry1_;
entry2 = (const struct mips_got_page_entry *) entry2_;
return entry1->abfd == entry2->abfd && entry1->symndx == entry2->symndx;
}
/* Return the dynamic relocation section. If it doesn't exist, try to
create a new it if CREATE_P, otherwise return NULL. Also return NULL
@ -2953,6 +2998,104 @@ mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
return TRUE;
}
/* Return the maximum number of GOT page entries required for RANGE. */
static bfd_vma
mips_elf_pages_for_range (const struct mips_got_page_range *range)
{
return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
}
/* Record that ABFD has a page relocation against symbol SYMNDX and that
ADDEND is the addend for that relocation. G is the GOT information. */
static bfd_boolean
mips_elf_record_got_page_entry (bfd *abfd, long symndx, bfd_signed_vma addend,
struct mips_got_info *g)
{
struct mips_got_page_entry lookup, *entry;
struct mips_got_page_range **range_ptr, *range;
bfd_vma old_pages, new_pages;
void **loc;
/* Find the mips_got_page_entry hash table entry for this symbol. */
lookup.abfd = abfd;
lookup.symndx = symndx;
loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
if (loc == NULL)
return FALSE;
/* Create a mips_got_page_entry if this is the first time we've
seen the symbol. */
entry = (struct mips_got_page_entry *) *loc;
if (!entry)
{
entry = bfd_alloc (abfd, sizeof (*entry));
if (!entry)
return FALSE;
entry->abfd = abfd;
entry->symndx = symndx;
entry->ranges = NULL;
entry->num_pages = 0;
*loc = entry;
}
/* Skip over ranges whose maximum extent cannot share a page entry
with ADDEND. */
range_ptr = &entry->ranges;
while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
range_ptr = &(*range_ptr)->next;
/* If we scanned to the end of the list, or found a range whose
minimum extent cannot share a page entry with ADDEND, create
a new singleton range. */
range = *range_ptr;
if (!range || addend < range->min_addend - 0xffff)
{
range = bfd_alloc (abfd, sizeof (*range));
if (!range)
return FALSE;
range->next = *range_ptr;
range->min_addend = addend;
range->max_addend = addend;
*range_ptr = range;
entry->num_pages++;
g->page_gotno++;
return TRUE;
}
/* Remember how many pages the old range contributed. */
old_pages = mips_elf_pages_for_range (range);
/* Update the ranges. */
if (addend < range->min_addend)
range->min_addend = addend;
else if (addend > range->max_addend)
{
if (range->next && addend >= range->next->min_addend - 0xffff)
{
old_pages += mips_elf_pages_for_range (range->next);
range->max_addend = range->next->max_addend;
range->next = range->next->next;
}
else
range->max_addend = addend;
}
/* Record any change in the total estimate. */
new_pages = mips_elf_pages_for_range (range);
if (old_pages != new_pages)
{
entry->num_pages += new_pages - old_pages;
g->page_gotno += new_pages - old_pages;
}
return TRUE;
}
/* Compute the hash value of the bfd in a bfd2got hash entry. */
@ -2994,7 +3137,65 @@ mips_elf_got_for_ibfd (struct mips_got_info *g, bfd *ibfd)
return p ? p->g : NULL;
}
/* Create one separate got for each bfd that has entries in the global
/* Use BFD2GOT to find ABFD's got entry, creating one if none exists.
Return NULL if an error occured. */
static struct mips_got_info *
mips_elf_get_got_for_bfd (struct htab *bfd2got, bfd *output_bfd,
bfd *input_bfd)
{
struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
struct mips_got_info *g;
void **bfdgotp;
bfdgot_entry.bfd = input_bfd;
bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
bfdgot = (struct mips_elf_bfd2got_hash *) *bfdgotp;
if (bfdgot == NULL)
{
bfdgot = ((struct mips_elf_bfd2got_hash *)
bfd_alloc (output_bfd, sizeof (struct mips_elf_bfd2got_hash)));
if (bfdgot == NULL)
return NULL;
*bfdgotp = bfdgot;
g = ((struct mips_got_info *)
bfd_alloc (output_bfd, sizeof (struct mips_got_info)));
if (g == NULL)
return NULL;
bfdgot->bfd = input_bfd;
bfdgot->g = g;
g->global_gotsym = NULL;
g->global_gotno = 0;
g->local_gotno = 0;
g->page_gotno = 0;
g->assigned_gotno = -1;
g->tls_gotno = 0;
g->tls_assigned_gotno = 0;
g->tls_ldm_offset = MINUS_ONE;
g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
mips_elf_multi_got_entry_eq, NULL);
if (g->got_entries == NULL)
return NULL;
g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
mips_got_page_entry_eq, NULL);
if (g->got_page_entries == NULL)
return NULL;
g->bfd2got = NULL;
g->next = NULL;
}
return bfdgot->g;
}
/* A htab_traverse callback for the entries in the master got.
Create one separate got for each bfd that has entries in the global
got, such that we can tell how many local and global entries each
bfd requires. */
@ -3003,58 +3204,13 @@ mips_elf_make_got_per_bfd (void **entryp, void *p)
{
struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
htab_t bfd2got = arg->bfd2got;
struct mips_got_info *g;
struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
void **bfdgotp;
/* Find the got_info for this GOT entry's input bfd. Create one if
none exists. */
bfdgot_entry.bfd = entry->abfd;
bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
bfdgot = (struct mips_elf_bfd2got_hash *)*bfdgotp;
if (bfdgot != NULL)
g = bfdgot->g;
else
g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
if (g == NULL)
{
bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
(arg->obfd, sizeof (struct mips_elf_bfd2got_hash));
if (bfdgot == NULL)
{
arg->obfd = 0;
return 0;
}
*bfdgotp = bfdgot;
bfdgot->bfd = entry->abfd;
bfdgot->g = g = (struct mips_got_info *)
bfd_alloc (arg->obfd, sizeof (struct mips_got_info));
if (g == NULL)
{
arg->obfd = 0;
return 0;
}
g->global_gotsym = NULL;
g->global_gotno = 0;
g->local_gotno = 0;
g->assigned_gotno = -1;
g->tls_gotno = 0;
g->tls_assigned_gotno = 0;
g->tls_ldm_offset = MINUS_ONE;
g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
mips_elf_multi_got_entry_eq, NULL);
if (g->got_entries == NULL)
{
arg->obfd = 0;
return 0;
}
g->bfd2got = NULL;
g->next = NULL;
arg->obfd = NULL;
return 0;
}
/* Insert the GOT entry in the bfd's got entry hash table. */
@ -3079,6 +3235,85 @@ mips_elf_make_got_per_bfd (void **entryp, void *p)
return 1;
}
/* A htab_traverse callback for the page entries in the master got.
Associate each page entry with the bfd's got. */
static int
mips_elf_make_got_pages_per_bfd (void **entryp, void *p)
{
struct mips_got_page_entry *entry = (struct mips_got_page_entry *) *entryp;
struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *) p;
struct mips_got_info *g;
g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
if (g == NULL)
{
arg->obfd = NULL;
return 0;
}
/* Insert the GOT entry in the bfd's got entry hash table. */
entryp = htab_find_slot (g->got_page_entries, entry, INSERT);
if (*entryp != NULL)
return 1;
*entryp = entry;
g->page_gotno += entry->num_pages;
return 1;
}
/* Consider merging the got described by BFD2GOT with TO, using the
information given by ARG. Return -1 if this would lead to overflow,
1 if they were merged successfully, and 0 if a merge failed due to
lack of memory. (These values are chosen so that nonnegative return
values can be returned by a htab_traverse callback.) */
static int
mips_elf_merge_got_with (struct mips_elf_bfd2got_hash *bfd2got,
struct mips_got_info *to,
struct mips_elf_got_per_bfd_arg *arg)
{
struct mips_got_info *from = bfd2got->g;
unsigned int estimate;
/* Work out how many page entries we would need for the combined GOT. */
estimate = arg->max_pages;
if (estimate >= from->page_gotno + to->page_gotno)
estimate = from->page_gotno + to->page_gotno;
/* And conservatively estimate how many local, global and TLS entries
would be needed. */
estimate += (from->local_gotno
+ from->global_gotno
+ from->tls_gotno
+ to->local_gotno
+ to->global_gotno
+ to->tls_gotno);
/* Bail out if the combined GOT might be too big. */
if (estimate > arg->max_count)
return -1;
/* Commit to the merge. Record that TO is now the bfd for this got. */
bfd2got->g = to;
/* Transfer the bfd's got information from FROM to TO. */
htab_traverse (from->got_entries, mips_elf_make_got_per_bfd, arg);
if (arg->obfd == NULL)
return 0;
htab_traverse (from->got_page_entries, mips_elf_make_got_pages_per_bfd, arg);
if (arg->obfd == NULL)
return 0;
/* We don't have to worry about releasing memory of the actual
got entries, since they're all in the master got_entries hash
table anyway. */
htab_delete (from->got_entries);
htab_delete (from->got_page_entries);
return 1;
}
/* Attempt to merge gots of different input bfds. Try to use as much
as possible of the primary got, since it doesn't require explicit
dynamic relocations, but don't use bfds that would reference global
@ -3092,98 +3327,53 @@ mips_elf_merge_gots (void **bfd2got_, void *p)
struct mips_elf_bfd2got_hash *bfd2got
= (struct mips_elf_bfd2got_hash *)*bfd2got_;
struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
unsigned int lcount = bfd2got->g->local_gotno;
unsigned int gcount = bfd2got->g->global_gotno;
unsigned int tcount = bfd2got->g->tls_gotno;
unsigned int maxcnt = arg->max_count;
bfd_boolean too_many_for_tls = FALSE;
struct mips_got_info *g;
unsigned int estimate;
int result;
g = bfd2got->g;
/* Work out the number of page, local and TLS entries. */
estimate = arg->max_pages;
if (estimate > g->page_gotno)
estimate = g->page_gotno;
estimate += g->local_gotno + g->tls_gotno;
/* We place TLS GOT entries after both locals and globals. The globals
for the primary GOT may overflow the normal GOT size limit, so be
sure not to merge a GOT which requires TLS with the primary GOT in that
case. This doesn't affect non-primary GOTs. */
if (tcount > 0)
estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
if (estimate <= arg->max_count)
{
unsigned int primary_total = lcount + tcount + arg->global_count;
if (primary_total > maxcnt)
too_many_for_tls = TRUE;
/* If we don't have a primary GOT, use it as
a starting point for the primary GOT. */
if (!arg->primary)
{
arg->primary = bfd2got->g;
return 1;
}
/* Try merging with the primary GOT. */
result = mips_elf_merge_got_with (bfd2got, arg->primary, arg);
if (result >= 0)
return result;
}
/* If we don't have a primary GOT and this is not too big, use it as
a starting point for the primary GOT. */
if (! arg->primary && lcount + gcount + tcount <= maxcnt
&& ! too_many_for_tls)
{
arg->primary = bfd2got->g;
arg->primary_count = lcount + gcount;
}
/* If it looks like we can merge this bfd's entries with those of
the primary, merge them. The heuristics is conservative, but we
don't have to squeeze it too hard. */
else if (arg->primary && ! too_many_for_tls
&& (arg->primary_count + lcount + gcount + tcount) <= maxcnt)
{
struct mips_got_info *g = bfd2got->g;
int old_lcount = arg->primary->local_gotno;
int old_gcount = arg->primary->global_gotno;
int old_tcount = arg->primary->tls_gotno;
bfd2got->g = arg->primary;
htab_traverse (g->got_entries,
mips_elf_make_got_per_bfd,
arg);
if (arg->obfd == NULL)
return 0;
htab_delete (g->got_entries);
/* We don't have to worry about releasing memory of the actual
got entries, since they're all in the master got_entries hash
table anyway. */
BFD_ASSERT (old_lcount + lcount >= arg->primary->local_gotno);
BFD_ASSERT (old_gcount + gcount >= arg->primary->global_gotno);
BFD_ASSERT (old_tcount + tcount >= arg->primary->tls_gotno);
arg->primary_count = arg->primary->local_gotno
+ arg->primary->global_gotno + arg->primary->tls_gotno;
}
/* If we can merge with the last-created got, do it. */
else if (arg->current
&& arg->current_count + lcount + gcount + tcount <= maxcnt)
if (arg->current)
{
struct mips_got_info *g = bfd2got->g;
int old_lcount = arg->current->local_gotno;
int old_gcount = arg->current->global_gotno;
int old_tcount = arg->current->tls_gotno;
bfd2got->g = arg->current;
htab_traverse (g->got_entries,
mips_elf_make_got_per_bfd,
arg);
if (arg->obfd == NULL)
return 0;
htab_delete (g->got_entries);
BFD_ASSERT (old_lcount + lcount >= arg->current->local_gotno);
BFD_ASSERT (old_gcount + gcount >= arg->current->global_gotno);
BFD_ASSERT (old_tcount + tcount >= arg->current->tls_gotno);
arg->current_count = arg->current->local_gotno
+ arg->current->global_gotno + arg->current->tls_gotno;
result = mips_elf_merge_got_with (bfd2got, arg->current, arg);
if (result >= 0)
return result;
}
/* Well, we couldn't merge, so create a new GOT. Don't check if it
fits; if it turns out that it doesn't, we'll get relocation
overflows anyway. */
else
{
bfd2got->g->next = arg->current;
arg->current = bfd2got->g;
arg->current_count = lcount + gcount + 2 * tcount;
}
g->next = arg->current;
arg->current = g;
return 1;
}
@ -3418,14 +3608,18 @@ mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
if (got_per_bfd_arg.obfd == NULL)
return FALSE;
/* Also count how many page entries each input bfd requires. */
htab_traverse (g->got_page_entries, mips_elf_make_got_pages_per_bfd,
&got_per_bfd_arg);
if (got_per_bfd_arg.obfd == NULL)
return FALSE;
got_per_bfd_arg.current = NULL;
got_per_bfd_arg.primary = NULL;
/* Taking out PAGES entries is a worst-case estimate. We could
compute the maximum number of pages that each separate input bfd
uses, but it's probably not worth it. */
got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
/ MIPS_ELF_GOT_SIZE (abfd))
- MIPS_RESERVED_GOTNO (info) - pages);
- MIPS_RESERVED_GOTNO (info));
got_per_bfd_arg.max_pages = pages;
/* The number of globals that will be included in the primary GOT.
See the calls to mips_elf_set_global_got_offset below for more
information. */
@ -3449,6 +3643,7 @@ mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
g->next->global_gotsym = NULL;
g->next->global_gotno = 0;
g->next->local_gotno = 0;
g->next->page_gotno = 0;
g->next->tls_gotno = 0;
g->next->assigned_gotno = 0;
g->next->tls_assigned_gotno = 0;
@ -3458,6 +3653,11 @@ mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
NULL);
if (g->next->got_entries == NULL)
return FALSE;
g->next->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
mips_got_page_entry_eq,
NULL);
if (g->next->got_page_entries == NULL)
return FALSE;
g->next->bfd2got = NULL;
}
else
@ -3562,7 +3762,8 @@ mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
assign += MIPS_RESERVED_GOTNO (info);
g->assigned_gotno = assign;
g->local_gotno += assign + pages;
g->local_gotno += assign;
g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
assign = g->local_gotno + g->global_gotno + g->tls_gotno;
/* Take g out of the direct list, and push it onto the reversed
@ -3814,6 +4015,7 @@ mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info,
g->global_gotno = 0;
g->tls_gotno = 0;
g->local_gotno = MIPS_RESERVED_GOTNO (info);
g->page_gotno = 0;
g->assigned_gotno = MIPS_RESERVED_GOTNO (info);
g->bfd2got = NULL;
g->next = NULL;
@ -3822,6 +4024,10 @@ mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info,
mips_elf_got_entry_eq, NULL);
if (g->got_entries == NULL)
return FALSE;
g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
mips_got_page_entry_eq, NULL);
if (g->got_page_entries == NULL)
return FALSE;
mips_elf_section_data (s)->u.got_info = g;
mips_elf_section_data (s)->elf.this_hdr.sh_flags
|= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
@ -6121,6 +6327,127 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
return TRUE;
}
/* Return true if relocation REL against section SEC is a REL rather than
RELA relocation. RELOCS is the first relocation in the section and
ABFD is the bfd that contains SEC. */
static bfd_boolean
mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
const Elf_Internal_Rela *relocs,
const Elf_Internal_Rela *rel)
{
Elf_Internal_Shdr *rel_hdr;
const struct elf_backend_data *bed;
/* To determine which flavor or relocation this is, we depend on the
fact that the INPUT_SECTION's REL_HDR is read before its REL_HDR2. */
rel_hdr = &elf_section_data (sec)->rel_hdr;
bed = get_elf_backend_data (abfd);
if ((size_t) (rel - relocs)
>= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
rel_hdr = elf_section_data (sec)->rel_hdr2;
return rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (abfd);
}
/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
HOWTO is the relocation's howto and CONTENTS points to the contents
of the section that REL is against. */
static bfd_vma
mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
reloc_howto_type *howto, bfd_byte *contents)
{
bfd_byte *location;
unsigned int r_type;
bfd_vma addend;
r_type = ELF_R_TYPE (abfd, rel->r_info);
location = contents + rel->r_offset;
/* Get the addend, which is stored in the input file. */
_bfd_mips16_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
addend = mips_elf_obtain_contents (howto, rel, abfd, contents);
_bfd_mips16_elf_reloc_shuffle (abfd, r_type, FALSE, location);
return addend & howto->src_mask;
}
/* REL is a relocation in ABFD that needs a partnering LO16 relocation
and *ADDEND is the addend for REL itself. Look for the LO16 relocation
and update *ADDEND with the final addend. Return true on success
or false if the LO16 could not be found. RELEND is the exclusive
upper bound on the relocations for REL's section. */
static bfd_boolean
mips_elf_add_lo16_rel_addend (bfd *abfd,
const Elf_Internal_Rela *rel,
const Elf_Internal_Rela *relend,
bfd_byte *contents, bfd_vma *addend)
{
unsigned int r_type, lo16_type;
const Elf_Internal_Rela *lo16_relocation;
reloc_howto_type *lo16_howto;
bfd_vma l;
r_type = ELF_R_TYPE (abfd, rel->r_info);
if (r_type == R_MIPS16_HI16)
lo16_type = R_MIPS16_LO16;
else
lo16_type = R_MIPS_LO16;
/* The combined value is the sum of the HI16 addend, left-shifted by
sixteen bits, and the LO16 addend, sign extended. (Usually, the
code does a `lui' of the HI16 value, and then an `addiu' of the
LO16 value.)
Scan ahead to find a matching LO16 relocation.
According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
be immediately following. However, for the IRIX6 ABI, the next
relocation may be a composed relocation consisting of several
relocations for the same address. In that case, the R_MIPS_LO16
relocation may occur as one of these. We permit a similar
extension in general, as that is useful for GCC.
In some cases GCC dead code elimination removes the LO16 but keeps
the corresponding HI16. This is strictly speaking a violation of
the ABI but not immediately harmful. */
lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
if (lo16_relocation == NULL)
return FALSE;
/* Obtain the addend kept there. */
lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
l <<= lo16_howto->rightshift;
l = _bfd_mips_elf_sign_extend (l, 16);
*addend <<= 16;
*addend += l;
return TRUE;
}
/* Try to read the contents of section SEC in bfd ABFD. Return true and
store the contents in *CONTENTS on success. Assume that *CONTENTS
already holds the contents if it is nonull on entry. */
static bfd_boolean
mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
{
if (*contents)
return TRUE;
/* Get cached copy if it exists. */
if (elf_section_data (sec)->this_hdr.contents != NULL)
{
*contents = elf_section_data (sec)->this_hdr.contents;
return TRUE;
}
return bfd_malloc_and_get_section (abfd, sec, contents);
}
/* Look through the relocs for a section during the first phase, and
allocate space in the global offset table. */
@ -6140,6 +6467,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
asection *sreloc;
const struct elf_backend_data *bed;
struct mips_elf_link_hash_table *htab;
bfd_byte *contents;
bfd_vma addend;
reloc_howto_type *howto;
if (info->relocatable)
return TRUE;
@ -6404,6 +6734,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
sreloc = NULL;
bed = get_elf_backend_data (abfd);
rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
contents = NULL;
for (rel = relocs; rel < rel_end; ++rel)
{
unsigned long r_symndx;
@ -6559,9 +6890,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_MIPS_GOT_PAGE:
/* If this is a global, overridable symbol, GOT_PAGE will
decay to GOT_DISP, so we'll need a GOT entry for it. */
if (h == NULL)
break;
else
if (h)
{
struct mips_elf_link_hash_entry *hmips =
(struct mips_elf_link_hash_entry *) h;
@ -6574,13 +6903,37 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (hmips->root.def_regular
&& ! (info->shared && ! info->symbolic
&& ! hmips->root.forced_local))
break;
h = NULL;
}
/* Fall through. */
case R_MIPS_GOT16:
case R_MIPS_GOT_HI16:
case R_MIPS_GOT_LO16:
if (!h)
{
/* This relocation needs a page entry in the GOT. */
if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
{
if (!mips_elf_get_section_contents (abfd, sec, &contents))
return FALSE;
howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
addend = mips_elf_read_rel_addend (abfd, rel,
howto, contents);
if (r_type == R_MIPS_GOT16)
mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
contents, &addend);
else
addend <<= howto->rightshift;
}
else
addend = rel->r_addend;
if (!mips_elf_record_got_page_entry (abfd, r_symndx, addend, g))
return FALSE;
break;
}
/* Fall through. */
case R_MIPS_GOT_DISP:
if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
return FALSE;
@ -6885,17 +7238,8 @@ _bfd_mips_relax_section (bfd *abfd, asection *sec,
continue;
/* Get the section contents if we haven't done so already. */
if (contents == NULL)
{
/* Get cached copy if it exists. */
if (elf_section_data (sec)->this_hdr.contents != NULL)
contents = elf_section_data (sec)->this_hdr.contents;
else
{
if (!bfd_malloc_and_get_section (abfd, sec, &contents))
goto relax_return;
}
}
if (!mips_elf_get_section_contents (abfd, sec, &contents))
goto relax_return;
instruction = bfd_get_32 (abfd, contents + irel->r_offset);
@ -7210,7 +7554,7 @@ _bfd_mips_elf_always_size_sections (bfd *output_bfd,
struct mips_got_info *g;
int i;
bfd_size_type loadable_size = 0;
bfd_size_type local_gotno;
bfd_size_type page_gotno;
bfd_size_type dynsymcount;
bfd *sub;
struct mips_elf_count_tls_arg count_tls_arg;
@ -7291,13 +7635,18 @@ _bfd_mips_elf_always_size_sections (bfd *output_bfd,
/* There's no need to allocate page entries for VxWorks; R_MIPS_GOT16
relocations against local symbols evaluate to "G", and the EABI does
not include R_MIPS_GOT_PAGE. */
local_gotno = 0;
page_gotno = 0;
else
/* Assume there are two loadable segments consisting of contiguous
sections. Is 5 enough? */
local_gotno = (loadable_size >> 16) + 5;
page_gotno = (loadable_size >> 16) + 5;
g->local_gotno += local_gotno;
/* Choose the smaller of the two estimates; both are intended to be
conservative. */
if (page_gotno > g->page_gotno)
page_gotno = g->page_gotno;
g->local_gotno += page_gotno;
s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
g->global_gotno = i;
@ -7321,7 +7670,7 @@ _bfd_mips_elf_always_size_sections (bfd *output_bfd,
dynamic loader. */
if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
{
if (! mips_elf_multi_got (output_bfd, info, g, s, local_gotno))
if (! mips_elf_multi_got (output_bfd, info, g, s, page_gotno))
return FALSE;
}
else
@ -7818,77 +8167,24 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
if (!use_saved_addend_p)
{
Elf_Internal_Shdr *rel_hdr;
/* If these relocations were originally of the REL variety,
we must pull the addend out of the field that will be
relocated. Otherwise, we simply use the contents of the
RELA relocation. To determine which flavor or relocation
this is, we depend on the fact that the INPUT_SECTION's
REL_HDR is read before its REL_HDR2. */
rel_hdr = &elf_section_data (input_section)->rel_hdr;
if ((size_t) (rel - relocs)
>= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
rel_hdr = elf_section_data (input_section)->rel_hdr2;
if (rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (input_bfd))
RELA relocation. */
if (mips_elf_rel_relocation_p (input_bfd, input_section,
relocs, rel))
{
bfd_byte *location = contents + rel->r_offset;
/* Note that this is a REL relocation. */
rela_relocation_p = FALSE;
/* Get the addend, which is stored in the input file. */
_bfd_mips16_elf_reloc_unshuffle (input_bfd, r_type, FALSE,
location);
addend = mips_elf_obtain_contents (howto, rel, input_bfd,
contents);
_bfd_mips16_elf_reloc_shuffle(input_bfd, r_type, FALSE,
location);
addend &= howto->src_mask;
/* For some kinds of relocations, the ADDEND is a
combination of the addend stored in two different
relocations. */
if (r_type == R_MIPS_HI16 || r_type == R_MIPS16_HI16
addend = mips_elf_read_rel_addend (input_bfd, rel,
howto, contents);
if (r_type == R_MIPS_HI16
|| r_type == R_MIPS16_HI16
|| (r_type == R_MIPS_GOT16
&& mips_elf_local_relocation_p (input_bfd, rel,
local_sections, FALSE)))
{
const Elf_Internal_Rela *lo16_relocation;
reloc_howto_type *lo16_howto;
int lo16_type;
if (r_type == R_MIPS16_HI16)
lo16_type = R_MIPS16_LO16;
else
lo16_type = R_MIPS_LO16;
/* The combined value is the sum of the HI16 addend,
left-shifted by sixteen bits, and the LO16
addend, sign extended. (Usually, the code does
a `lui' of the HI16 value, and then an `addiu' of
the LO16 value.)
Scan ahead to find a matching LO16 relocation.
According to the MIPS ELF ABI, the R_MIPS_LO16
relocation must be immediately following.
However, for the IRIX6 ABI, the next relocation
may be a composed relocation consisting of
several relocations for the same address. In
that case, the R_MIPS_LO16 relocation may occur
as one of these. We permit a similar extension
in general, as that is useful for GCC.
In some cases GCC dead code elimination removes
the LO16 but keeps the corresponding HI16. This
is strictly speaking a violation of the ABI but
not immediately harmful. */
lo16_relocation = mips_elf_next_relocation (input_bfd,
lo16_type,
rel, relend);
if (lo16_relocation == NULL)
if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
contents, &addend))
{
const char *name;
@ -7903,32 +8199,6 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
input_bfd, input_section, name, howto->name,
rel->r_offset);
}
else
{
bfd_byte *lo16_location;
bfd_vma l;
lo16_location = contents + lo16_relocation->r_offset;
/* Obtain the addend kept there. */
lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd,
lo16_type, FALSE);
_bfd_mips16_elf_reloc_unshuffle (input_bfd, lo16_type,
FALSE, lo16_location);
l = mips_elf_obtain_contents (lo16_howto,
lo16_relocation,
input_bfd, contents);
_bfd_mips16_elf_reloc_shuffle (input_bfd, lo16_type,
FALSE, lo16_location);
l &= lo16_howto->src_mask;
l <<= lo16_howto->rightshift;
l = _bfd_mips_elf_sign_extend (l, 16);
addend <<= 16;
/* Compute the combined addend. */
addend += l;
}
}
else
addend <<= howto->rightshift;

View file

@ -1,3 +1,27 @@
2007-11-14 Richard Sandiford <richard@codesourcery.com>
Joseph Myers <joseph@codesourcery.com>
* ld-mips-elf/got-page-1.d, ld-mips-elf/got-page-1.s,
* ld-mips-elf/got-page-2.d, ld-mips-elf/got-page-2.s,
* ld-mips-elf/got-page-3.d, ld-mips-elf/got-page-3a.s,
* ld-mips-elf/got-page-3b.s, ld-mips-elf/got-page-3c.s,
* ld-mips-elf/got-page-1.ld: New tests.
* ld-mips-elf/mips-elf.exp: Run them.
* ld-mips-elf/multi-got-1.d, ld-mips-elf/multi-got-no-shared.d,
* ld-mips-elf/tls-hidden2-got.d, ld-mips-elf/tls-hidden2.d,
* ld-mips-elf/tls-hidden3.d, ld-mips-elf/tls-hidden3.got,
* ld-mips-elf/tls-hidden3.r, ld-mips-elf/tls-hidden4.got,
* ld-mips-elf/tls-hidden4.r, ld-mips-elf/tls-multi-got-1.d,
* ld-mips-elf/tls-multi-got-1.got, ld-mips-elf/tls-multi-got-1.r,
* ld-mips-elf/tlsbin-o32.d, ld-mips-elf/tlsbin-o32.got,
* ld-mips-elf/tlsdyn-o32-1.d, ld-mips-elf/tlsdyn-o32-1.got,
* ld-mips-elf/tlsdyn-o32-2.d, ld-mips-elf/tlsdyn-o32-2.got,
* ld-mips-elf/tlsdyn-o32-3.d, ld-mips-elf/tlsdyn-o32-3.got,
* ld-mips-elf/tlsdyn-o32.d, ld-mips-elf/tlsdyn-o32.got,
* ld-mips-elf/tlslib-o32-hidden.got, ld-mips-elf/tlslib-o32-ver.got,
* ld-mips-elf/tlslib-o32.d, ld-mips-elf/tlslib-o32.got: Update for
GOT allocation changes.
2007-11-14 Hans-Peter Nilsson <hp@axis.com>
* ld-elf/flags1.d: Generalize regexp for section size.

View file

@ -0,0 +1,10 @@
#name: GOT page test 1
#source: got-page-1.s
#ld: -T got-page-1.ld -shared
#readelf: -d
#
# There should be 10 page entries and 2 reserved entries
#
#...
.* \(MIPS_LOCAL_GOTNO\) *12
#pass

View file

@ -0,0 +1,31 @@
SECTIONS
{
. = 0x80000;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
. = ALIGN (0x400);
.rel.dyn : { *(.rel.dyn) }
. = ALIGN (0x400);
.MIPS.stubs : { *(.MIPS.stubs) }
. = ALIGN (0x400);
.text : { *(.text) }
. = ALIGN (0x10000);
_gp = . + 0x7ff0;
.got : { *(.got) }
. = ALIGN (0x400);
.bss : { *(.bss .bss.*) }
/DISCARD/ : { *(.reginfo) }
}
VERSION
{
{ local: *; };
}

View file

@ -0,0 +1,46 @@
# See below.
lw $4,%got(foo+0x120000)($gp)
addiu $4,$4,%lo(foo+0x120000)
# 2 pages
lw $4,%got(foo-0x8000)($gp)
addiu $4,$4,%lo(foo-0x8000)
lw $4,%got(foo+0x800)($gp)
addiu $4,$4,%lo(foo+0x8000)
# 2 pages
lw $4,%got(foo-0x1000000)($gp)
addiu $4,$4,%lo(foo-0x1000000)
lw $4,%got(foo-0xffffff)($gp)
addiu $4,$4,%lo(foo-0xffffff)
# 1 page
lw $4,%got(foo+0x120000)($gp)
addiu $4,$4,%lo(foo+0x120000)
# 5 pages
lw $4,%got(bar)($gp)
addiu $4,$4,%lo(bar)
lw $4,%got(bar+0x20000)($gp)
addiu $4,$4,%lo(bar+0x20000)
lw $4,%got(bar+0x40000)($gp)
addiu $4,$4,%lo(bar+0x40000)
lw $4,%got(bar+0x30000)($gp)
addiu $4,$4,%lo(bar+0x30000)
lw $4,%got(bar+0x10000)($gp)
addiu $4,$4,%lo(bar+0x10000)
lw $4,%got(bar+0x38000)($gp)
addiu $4,$4,%lo(bar+0x38000)
lw $4,%got(bar+0x14000)($gp)
addiu $4,$4,%lo(bar+0x14000)
lw $4,%got(bar+0x2c000)($gp)
addiu $4,$4,%lo(bar+0x2c000)
lw $4,%got(bar+0x02000)($gp)
addiu $4,$4,%lo(bar+0x02000)
.section .bss.foo,"aw",@nobits
.fill 0x800000
foo: .fill 0x800000
.section .bss.bar,"aw",@nobits
bar: .fill 0xc00000

View file

@ -0,0 +1,11 @@
#name: GOT page test 2
#source: got-page-2.s
#as: -EB -n32
#ld: -T got-page-1.ld -shared -melf32btsmipn32
#readelf: -d
#
# There should be 10 page entries and 2 reserved entries
#
#...
.* \(MIPS_LOCAL_GOTNO\) *12
#pass

View file

@ -0,0 +1,46 @@
# See below.
lw $4,%got_page(foo+0x120000)($gp)
addiu $4,$4,%got_ofst(foo+0x120000)
# 2 pages
lw $4,%got_page(foo-0x8000)($gp)
addiu $4,$4,%got_ofst(foo-0x8000)
lw $4,%got_page(foo+0x800)($gp)
addiu $4,$4,%got_ofst(foo+0x8000)
# 2 pages
lw $4,%got_page(foo-0x1000000)($gp)
addiu $4,$4,%got_ofst(foo-0x1000000)
lw $4,%got_page(foo-0xffffff)($gp)
addiu $4,$4,%got_ofst(foo-0xffffff)
# 1 page
lw $4,%got_page(foo+0x120000)($gp)
addiu $4,$4,%got_ofst(foo+0x120000)
# 5 pages
lw $4,%got_page(bar)($gp)
addiu $4,$4,%got_ofst(bar)
lw $4,%got_page(bar+0x20000)($gp)
addiu $4,$4,%got_ofst(bar+0x20000)
lw $4,%got_page(bar+0x40000)($gp)
addiu $4,$4,%got_ofst(bar+0x40000)
lw $4,%got_page(bar+0x30000)($gp)
addiu $4,$4,%got_ofst(bar+0x30000)
lw $4,%got_page(bar+0x10000)($gp)
addiu $4,$4,%got_ofst(bar+0x10000)
lw $4,%got_page(bar+0x38000)($gp)
addiu $4,$4,%got_ofst(bar+0x38000)
lw $4,%got_page(bar+0x14000)($gp)
addiu $4,$4,%got_ofst(bar+0x14000)
lw $4,%got_page(bar+0x2c000)($gp)
addiu $4,$4,%got_ofst(bar+0x2c000)
lw $4,%got_page(bar+0x02000)($gp)
addiu $4,$4,%got_ofst(bar+0x02000)
.section .bss.foo,"aw",@nobits
.fill 0x800000
foo: .fill 0x800000
.section .bss.bar,"aw",@nobits
bar: .fill 0xc00000

View file

@ -0,0 +1,26 @@
#name: GOT page test 3
#source: got-page-3a.s
#source: got-page-3b.s
#source: got-page-3c.s
#as: -mips3
#ld: -T got-page-1.ld -shared
#objdump: -dr
#
# got-page-3a.s and got-page-3b.s should get assigned the same GOT,
# with a page estimate of 10. Thus the first page entry has offset
# -32744 (-32768 + 0x8000 - ELF_MIPS_GP_OFFSET + MIPS_RESERVED_GOTNO)
# and the first global entry has an offset -32744 + 40 == -32704.
#
# got-page-3c.s should get its own GOT, and needs no page entries.
# The first global symbol should therefore be at offset -32744.
#
#...
.* lw a0,-32744\(gp\)
.* addiu a0,a0,.*
#...
.* lw a1,-32704\(gp\)
#...
.* <f3>:
#...
.* lw a1,-32744\(gp\)
#pass

View file

@ -0,0 +1,58 @@
.macro makeref,sym
lw $5,%got(\sym\@)($gp)
.endm
.globl f1
.ent f1
f1:
# See below.
lw $4,%got(foo+0x120000)($gp)
addiu $4,$4,%lo(foo+0x120000)
# 2 pages
lw $4,%got(foo-0x8000)($gp)
addiu $4,$4,%lo(foo-0x8000)
lw $4,%got(foo+0x800)($gp)
addiu $4,$4,%lo(foo+0x8000)
# 2 pages
lw $4,%got(foo-0x1000000)($gp)
addiu $4,$4,%lo(foo-0x1000000)
lw $4,%got(foo-0xffffff)($gp)
addiu $4,$4,%lo(foo-0xffffff)
# 1 page
lw $4,%got(foo+0x120000)($gp)
addiu $4,$4,%lo(foo+0x120000)
# 5 pages
lw $4,%got(bar)($gp)
addiu $4,$4,%lo(bar)
lw $4,%got(bar+0x20000)($gp)
addiu $4,$4,%lo(bar+0x20000)
lw $4,%got(bar+0x40000)($gp)
addiu $4,$4,%lo(bar+0x40000)
lw $4,%got(bar+0x30000)($gp)
addiu $4,$4,%lo(bar+0x30000)
lw $4,%got(bar+0x10000)($gp)
addiu $4,$4,%lo(bar+0x10000)
lw $4,%got(bar+0x38000)($gp)
addiu $4,$4,%lo(bar+0x38000)
lw $4,%got(bar+0x14000)($gp)
addiu $4,$4,%lo(bar+0x14000)
lw $4,%got(bar+0x2c000)($gp)
addiu $4,$4,%lo(bar+0x2c000)
lw $4,%got(bar+0x02000)($gp)
addiu $4,$4,%lo(bar+0x02000)
.end f1
.rept 8000
makeref foo
.endr
.section .bss.foo,"aw",@nobits
.fill 0x800000
foo: .fill 0x800000
.section .bss.bar,"aw",@nobits
bar: .fill 0xc00000

View file

@ -0,0 +1,11 @@
.macro makeref,sym
lw $5,%got(\sym\@)($gp)
.endm
.globl f2
.ent f2
f2:
.rept 8000
makeref bar
.endr
.end f2

View file

@ -0,0 +1,11 @@
.macro makeref,sym
lw $5,%got(\sym\@)($gp)
.endm
.globl f3
.ent f3
f3:
.rept 8000
makeref frob
.endr
.end f3

View file

@ -144,6 +144,11 @@ if {$has_newabi} {
if { $linux_gnu } {
run_dump_test "textrel-1"
run_dump_test "got-page-1"
if $has_newabi {
run_dump_test "got-page-2"
}
run_dump_test "got-page-3"
}
if $has_newabi {

View file

@ -19,7 +19,7 @@ Dynamic section at offset .* contains 17 entries:
0x70000001 \(MIPS_RLD_VERSION\) 1
0x70000005 \(MIPS_FLAGS\) NOTPOT
0x70000006 \(MIPS_BASE_ADDRESS\) 0
0x7000000a \(MIPS_LOCAL_GOTNO\) 12
0x7000000a \(MIPS_LOCAL_GOTNO\) 2
0x70000011 \(MIPS_SYMTABNO\) [0-9]+
0x70000012 \(MIPS_UNREFEXTNO\) [0-9]+
0x70000013 \(MIPS_GOTSYM\) 0x[0-9a-f]+

View file

@ -9,10 +9,10 @@
Disassembly of section \.text:
004000b0 <[^>]*> 3c1c0043 lui gp,0x43
004000b4 <[^>]*> 279c9ff0 addiu gp,gp,-24592
004000b4 <[^>]*> 279c9a00 addiu gp,gp,-26112
004000b8 <[^>]*> afbc0008 sw gp,8\(sp\)
#...
00408d60 <[^>]*> 3c1c0044 lui gp,0x44
00408d64 <[^>]*> 279cb960 addiu gp,gp,-18080
00408d64 <[^>]*> 279cb348 addiu gp,gp,-19640
00408d68 <[^>]*> afbc0008 sw gp,8\(sp\)
#pass

View file

@ -2,5 +2,4 @@
.*file format.*
Contents of section \.got:
*[0-9a-f]* 00000000 80000000 00000000 00000000 *\..*
*[0-9a-f]* 00000000 00000000 00000000 00000ba8 *\..*
*[0-9a-f]* 00000000 80000000 00000ba8 *\..*

View file

@ -4,7 +4,7 @@
Disassembly of section \.text:
.* <.*>:
.*: 8f82802c * lw v0,-32724\(gp\)
.*: 8f828018 * lw v0,-32744\(gp\)
\.\.\.
.*: 8f82802c * lw v0,-32724\(gp\)
.*: 8f828018 * lw v0,-32744\(gp\)
\.\.\.

View file

@ -14,11 +14,11 @@ Disassembly of section \.text:
# Any order would be acceptable, but it must match the .got dump.
#
00080c00 <\.text>:
80c00: 8f848030 lw a0,-32720\(gp\)
80c04: 8f84803c lw a0,-32708\(gp\)
80c08: 8f848034 lw a0,-32716\(gp\)
80c0c: 8f848038 lw a0,-32712\(gp\)
80c10: 8f848030 lw a0,-32720\(gp\)
80c14: 8f84803c lw a0,-32708\(gp\)
80c18: 8f848034 lw a0,-32716\(gp\)
80c1c: 8f848038 lw a0,-32712\(gp\)
80c00: 8f84801c lw a0,-32740\(gp\)
80c04: 8f848028 lw a0,-32728\(gp\)
80c08: 8f848020 lw a0,-32736\(gp\)
80c0c: 8f848024 lw a0,-32732\(gp\)
80c10: 8f84801c lw a0,-32740\(gp\)
80c14: 8f848028 lw a0,-32728\(gp\)
80c18: 8f848020 lw a0,-32736\(gp\)
80c1c: 8f848024 lw a0,-32732\(gp\)

View file

@ -19,6 +19,5 @@
# Any order would be acceptable, but it must match the .d dump.
#
Contents of section \.got:
90000 00000000 80000000 00000000 00000000 .*
90010 00000000 00000000 00000000 00000000 .*
90020 0000abc0 0000abc8 0000abcc 0000abc4 .*
90000 00000000 80000000 00000000 0000abc0 .*
90010 0000abc8 0000abcc 0000abc4 .*

View file

@ -6,8 +6,8 @@ Relocation section '\.rel\.dyn' at offset .* contains 6 entries:
# The order of the next four entries doesn't matter. The important thing
# is that there is exactly one entry per GOT TLS slot.
#
00090020 0000002f R_MIPS_TLS_TPREL3
00090024 0000002f R_MIPS_TLS_TPREL3
00090028 0000002f R_MIPS_TLS_TPREL3
0009002c 0000002f R_MIPS_TLS_TPREL3
00090030 .*03 R_MIPS_REL32 00000000 undef
0009000c 0000002f R_MIPS_TLS_TPREL3
00090010 0000002f R_MIPS_TLS_TPREL3
00090014 0000002f R_MIPS_TLS_TPREL3
00090018 0000002f R_MIPS_TLS_TPREL3
00090020 .*03 R_MIPS_REL32 00000000 undef

View file

@ -15,7 +15,8 @@ Contents of section \.got:
# entry for each symbol.
#
#...
1c4080 0000abc8 0000abcc 0000abc0 0000abc4 .*
1c4010 00000000 00000000 0000abc8 0000abcc .*
1c4020 0000abc0 0000abc4 00000000 80000000 .*
#
# Likewise, but the order of the entries in this GOT is:
#
@ -24,5 +25,4 @@ Contents of section \.got:
# foo0
# foo1
#...
1d00c0 00000000 00000000 00000000 0000abcc .*
1d00d0 0000abc8 0000abc0 0000abc4 .*
1d0030 0000abcc 0000abc8 0000abc0 0000abc4 .*

View file

@ -7,13 +7,13 @@ Relocation section '\.rel\.dyn' at offset .* contains .* entries:
# important thing is that there is exactly one entry per GOT TLS slot
# and that the addresses match those in the .got dump.
#
001c4080 0000002f R_MIPS_TLS_TPREL3
001c4084 0000002f R_MIPS_TLS_TPREL3
001c4088 0000002f R_MIPS_TLS_TPREL3
001c408c 0000002f R_MIPS_TLS_TPREL3
001d00cc 0000002f R_MIPS_TLS_TPREL3
001d00d0 0000002f R_MIPS_TLS_TPREL3
001d00d4 0000002f R_MIPS_TLS_TPREL3
001d00d8 0000002f R_MIPS_TLS_TPREL3
001c4018 0000002f R_MIPS_TLS_TPREL3
001c401c 0000002f R_MIPS_TLS_TPREL3
001c4020 0000002f R_MIPS_TLS_TPREL3
001c4024 0000002f R_MIPS_TLS_TPREL3
001d0030 0000002f R_MIPS_TLS_TPREL3
001d0034 0000002f R_MIPS_TLS_TPREL3
001d0038 0000002f R_MIPS_TLS_TPREL3
001d003c 0000002f R_MIPS_TLS_TPREL3
.* R_MIPS_REL32 .*
#pass

View file

@ -5,16 +5,16 @@ Disassembly of section .text:
#...
[0-9a-f]+ <tls_bits_1>:
[0-9a-f]+: 27841c90 addiu a0,gp,7312
[0-9a-f]+: 27841c84 addiu a0,gp,7300
[0-9a-f]+: 24441c8c addiu a0,v0,7308
[0-9a-f]+: 27841c64 addiu a0,gp,7268
[0-9a-f]+: 27841c58 addiu a0,gp,7256
[0-9a-f]+: 24441c60 addiu a0,v0,7264
[0-9a-f]+: 00000000 nop
[0-9a-f]+ <sym_2_0000>:
#...
[0-9a-f]+ <tls_bits_2>:
[0-9a-f]+: 27841c90 addiu a0,gp,7312
[0-9a-f]+: 27841c84 addiu a0,gp,7300
[0-9a-f]+: 24441c8c addiu a0,v0,7308
[0-9a-f]+: 27841c64 addiu a0,gp,7268
[0-9a-f]+: 27841c58 addiu a0,gp,7256
[0-9a-f]+: 24441c60 addiu a0,v0,7264
[0-9a-f]+: 00000000 nop
#pass

View file

@ -4,33 +4,33 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
0013f948 R_MIPS_TLS_DTPMOD32 \*ABS\*
001495d0 R_MIPS_TLS_DTPMOD32 \*ABS\*
0013f954 R_MIPS_TLS_DTPMOD32 tlsvar_gd
0013f958 R_MIPS_TLS_DTPREL32 tlsvar_gd
001495dc R_MIPS_TLS_DTPMOD32 tlsvar_gd
001495e0 R_MIPS_TLS_DTPREL32 tlsvar_gd
0013f950 R_MIPS_TLS_TPREL32 tlsvar_ie
001495d8 R_MIPS_TLS_TPREL32 tlsvar_ie
00143f7c R_MIPS_REL32 sym_1_9526
0013f840 R_MIPS_TLS_DTPMOD32 \*ABS\*
0014949c R_MIPS_TLS_DTPMOD32 \*ABS\*
0013f84c R_MIPS_TLS_DTPMOD32 tlsvar_gd
0013f850 R_MIPS_TLS_DTPREL32 tlsvar_gd
001494a8 R_MIPS_TLS_DTPMOD32 tlsvar_gd
001494ac R_MIPS_TLS_DTPREL32 tlsvar_gd
0013f848 R_MIPS_TLS_TPREL32 tlsvar_ie
001494a4 R_MIPS_TLS_TPREL32 tlsvar_ie
00143e48 R_MIPS_REL32 sym_1_9526
#...
00139bd0 R_MIPS_REL32 sym_2_8654
00139ac8 R_MIPS_REL32 sym_2_8654
Contents of section .got:
122420 00000000 80000000 00000000 00000000 .*
122430 00000000 00000000 00000000 00000000 .*
122440 00000000 00000000 00000000 00000000 .*
122450 00000000 000d8048 000d66a4 000d2054 .*
122370 00000000 80000000 000d7f98 000d65f4 .*
122380 000d1fa4 000d6010 000d5a48 000d19c0 .*
#...
13f930 00000000 00000000 00000000 00000000 .*
13f940 00000000 00000000 00000000 00000000 .*
13f950 00000000 00000000 00000000 00000000 .*
13f960 80000000 00000000 00000000 00000000 .*
135bf0 000cf204 000e0e48 00000000 80000000 .*
135c00 00000000 00000000 00000000 00000000 .*
#...
1495a0 00000000 00000000 00000000 00000000 .*
1495b0 00000000 00000000 00000000 00000000 .*
1495c0 00000000 00000000 00000000 00000000 .*
1495d0 00000000 00000000 00000000 00000000 .*
1495e0 00000000 .*
13f830 00000000 00000000 00000000 00000000 .*
13f840 00000000 00000000 00000000 00000000 .*
13f850 00000000 00000000 80000000 00000000 .*
#...
149460 00000000 00000000 00000000 00000000 .*
149470 00000000 00000000 00000000 00000000 .*
149480 00000000 00000000 00000000 00000000 .*
149490 00000000 00000000 00000000 00000000 .*
1494a0 00000000 00000000 00000000 00000000 .*
#pass

View file

@ -6,14 +6,14 @@ Dynamic section at offset .* contains 18 entries:
0x00000006 \(SYMTAB\).*
0x0000000a \(STRSZ\) 220091 \(bytes\)
0x0000000b \(SYMENT\) 16 \(bytes\)
0x00000003 \(PLTGOT\) 0x122420
0x00000003 \(PLTGOT\) 0x122370
0x00000011 \(REL\) 0xa7978
0x00000012 \(RELSZ\) 160072 \(bytes\)
0x00000013 \(RELENT\) 8 \(bytes\)
0x70000001 \(MIPS_RLD_VERSION\) 1
0x70000005 \(MIPS_FLAGS\) NOTPOT
0x70000006 \(MIPS_BASE_ADDRESS\) 0
0x7000000a \(MIPS_LOCAL_GOTNO\) 13
0x7000000a \(MIPS_LOCAL_GOTNO\) 2
0x70000011 \(MIPS_SYMTABNO\) 20013
0x70000012 \(MIPS_UNREFEXTNO\) 11
0x70000013 \(MIPS_GOTSYM\) 0xd
@ -31,8 +31,8 @@ Relocation section '\.rel\.dyn' at offset 0x[0-9a-f]+ contains 20009 entries:
[0-9a-f ]+R_MIPS_TLS_DTPREL 00000000 tlsvar_gd
[0-9a-f ]+R_MIPS_TLS_TPREL3 00000004 tlsvar_ie
[0-9a-f ]+R_MIPS_TLS_TPREL3 00000004 tlsvar_ie
[0-9a-f ]+R_MIPS_REL32 000d8048 sym_1_9526
[0-9a-f ]+R_MIPS_REL32 000d66a4 sym_1_7885
[0-9a-f ]+R_MIPS_REL32 000d7f98 sym_1_9526
[0-9a-f ]+R_MIPS_REL32 000d65f4 sym_1_7885
#...
[0-9a-f ]+R_MIPS_REL32 000cf2b4 sym_1_0465
[0-9a-f ]+R_MIPS_REL32 000e0ef8 sym_2_8654
[0-9a-f ]+R_MIPS_REL32 000cf204 sym_1_0465
[0-9a-f ]+R_MIPS_REL32 000e0e48 sym_2_8654

View file

@ -10,14 +10,14 @@ Disassembly of section .text:
4000e0: afbe0008 sw s8,8\(sp\)
4000e4: 03a0f021 move s8,sp
4000e8: afbc0000 sw gp,0\(sp\)
4000ec: 8f99802c lw t9,-32724\(gp\)
4000f0: 2784803c addiu a0,gp,-32708
4000ec: 8f998018 lw t9,-32744\(gp\)
4000f0: 27848028 addiu a0,gp,-32728
4000f4: 0320f809 jalr t9
4000f8: 00000000 nop
4000fc: 8fdc0000 lw gp,0\(s8\)
400100: 00000000 nop
400104: 8f99802c lw t9,-32724\(gp\)
400108: 27848034 addiu a0,gp,-32716
400104: 8f998018 lw t9,-32744\(gp\)
400108: 27848020 addiu a0,gp,-32736
40010c: 0320f809 jalr t9
400110: 00000000 nop
400114: 8fdc0000 lw gp,0\(s8\)
@ -26,7 +26,7 @@ Disassembly of section .text:
400120: 24638000 addiu v1,v1,-32768
400124: 00621821 addu v1,v1,v0
400128: 7c02283b rdhwr v0,\$5
40012c: 8f838030 lw v1,-32720\(gp\)
40012c: 8f83801c lw v1,-32740\(gp\)
400130: 00000000 nop
400134: 00621821 addu v1,v1,v0
400138: 7c02283b rdhwr v0,\$5

View file

@ -2,7 +2,5 @@
.*: file format elf32-tradbigmips
Contents of section .got:
10000010 00000000 80000000 00000000 00000000 ................
10000020 00000000 00000000 00000000 00400158 .............@.X
10000030 ffff900c 00000001 00000000 00000001 ................
10000040 ffff8008 ....
10000010 00000000 80000000 00400158 ffff900c .........@.X....
10000020 00000001 00000000 00000001 ffff8008 ................

View file

@ -11,32 +11,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
@ -61,32 +61,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5

View file

@ -4,16 +4,15 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
10000054 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000058 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000048 R_MIPS_TLS_DTPMOD32 tlsvar_gd
1000004c R_MIPS_TLS_DTPREL32 tlsvar_gd
10000050 R_MIPS_TLS_TPREL32 tlsvar_ie
1000005c R_MIPS_TLS_TPREL32 tlsbin_ie
10000040 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000044 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000034 R_MIPS_TLS_DTPMOD32 tlsvar_gd
10000038 R_MIPS_TLS_DTPREL32 tlsvar_gd
1000003c R_MIPS_TLS_TPREL32 tlsvar_ie
10000048 R_MIPS_TLS_TPREL32 tlsbin_ie
Contents of section .got:
10000020 00000000 80000000 00000000 00000000 ................
10000030 00000000 00000000 00000000 0040053c .............@..
10000040 00000001 00000000 00000000 00000000 ................
10000050 00000000 00000000 00000000 00000000 ................
10000020 00000000 80000000 0040053c 00000001 .........@......
10000030 00000000 00000000 00000000 00000000 ................
10000040 00000000 00000000 00000000 ............

View file

@ -11,32 +11,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
@ -61,32 +61,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5

View file

@ -4,17 +4,16 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
10000054 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000058 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000048 R_MIPS_TLS_DTPMOD32 tlsvar_gd
1000004c R_MIPS_TLS_DTPREL32 tlsvar_gd
10000050 R_MIPS_TLS_TPREL32 tlsvar_ie
1000005c R_MIPS_TLS_TPREL32 tlsbin_ie
10000040 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000044 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000034 R_MIPS_TLS_DTPMOD32 tlsvar_gd
10000038 R_MIPS_TLS_DTPREL32 tlsvar_gd
1000003c R_MIPS_TLS_TPREL32 tlsvar_ie
10000048 R_MIPS_TLS_TPREL32 tlsbin_ie
Contents of section .got:
10000020 00000000 80000000 00000000 00000000 .*
10000030 00000000 00000000 00000000 0040053c .*
10000040 00000001 00000000 00000000 00000000 .*
10000050 00000000 00000000 00000000 00000000 .*
10000060 00000000 00000000 00000000 .*
10000020 00000000 80000000 0040053c 00000001 .*
10000030 00000000 00000000 00000000 00000000 .*
10000040 00000000 00000000 00000000 00000000 .*
10000050 00000000 00000000 .*

View file

@ -11,32 +11,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
@ -57,32 +57,32 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848044 addiu a0,gp,-32700
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00401021 move v0,v0
.*: 3c030000 lui v1,0x0
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f83804c lw v1,-32692\(gp\)
.*: 8f838038 lw v1,-32712\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5

View file

@ -4,17 +4,16 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
10000054 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000058 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000048 R_MIPS_TLS_DTPMOD32 tlsvar_gd
1000004c R_MIPS_TLS_DTPREL32 tlsvar_gd
10000050 R_MIPS_TLS_TPREL32 tlsvar_ie
1000005c R_MIPS_TLS_TPREL32 tlsbin_ie
10000040 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000044 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000034 R_MIPS_TLS_DTPMOD32 tlsvar_gd
10000038 R_MIPS_TLS_DTPREL32 tlsvar_gd
1000003c R_MIPS_TLS_TPREL32 tlsvar_ie
10000048 R_MIPS_TLS_TPREL32 tlsbin_ie
Contents of section .got:
10000020 00000000 80000000 00000000 00000000 .*
10000030 00000000 00000000 00000000 004005ec .*
10000040 00000001 00000000 00000000 00000000 .*
10000050 00000000 00000000 00000000 00000000 .*
10000060 00000000 00000000 00000000 .*
10000020 00000000 80000000 004005ec 00000001 .*
10000030 00000000 00000000 00000000 00000000 .*
10000040 00000000 00000000 00000000 00000000 .*
10000050 00000000 00000000 .*

View file

@ -11,20 +11,20 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848038 addiu a0,gp,-32712
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848024 addiu a0,gp,-32732
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848048 addiu a0,gp,-32696
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848034 addiu a0,gp,-32716
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848030 addiu a0,gp,-32720
.*: 8f998018 lw t9,-32744\(gp\)
.*: 2784801c addiu a0,gp,-32740
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
@ -33,10 +33,10 @@ Disassembly of section .text:
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f838044 lw v1,-32700\(gp\)
.*: 8f838030 lw v1,-32720\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 8f838040 lw v1,-32704\(gp\)
.*: 8f83802c lw v1,-32724\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5

View file

@ -4,16 +4,15 @@ tmpdir/tls-dynamic-o32: file format elf32-tradbigmips
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
10000048 R_MIPS_TLS_DTPMOD32 tlsbin_gd
1000004c R_MIPS_TLS_DTPREL32 tlsbin_gd
10000058 R_MIPS_TLS_DTPMOD32 tlsvar_gd
1000005c R_MIPS_TLS_DTPREL32 tlsvar_gd
10000054 R_MIPS_TLS_TPREL32 tlsbin_ie
10000050 R_MIPS_TLS_TPREL32 tlsvar_ie
10000034 R_MIPS_TLS_DTPMOD32 tlsbin_gd
10000038 R_MIPS_TLS_DTPREL32 tlsbin_gd
10000044 R_MIPS_TLS_DTPMOD32 tlsvar_gd
10000048 R_MIPS_TLS_DTPREL32 tlsvar_gd
10000040 R_MIPS_TLS_TPREL32 tlsbin_ie
1000003c R_MIPS_TLS_TPREL32 tlsvar_ie
Contents of section .got:
10000020 00000000 80000000 00000000 00000000 ................
10000030 00000000 00000000 00000000 0040051c ................
10000040 00000001 00000000 00000000 00000000 ................
10000050 00000000 00000000 00000000 00000000 ................
10000020 00000000 80000000 0040051c 00000001 ................
10000030 00000000 00000000 00000000 00000000 ................
10000040 00000000 00000000 00000000 ............

View file

@ -4,13 +4,11 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
000403d0 R_MIPS_TLS_TPREL32 \*ABS\*
000403d4 R_MIPS_TLS_DTPMOD32 \*ABS\*
000403dc R_MIPS_TLS_DTPMOD32 \*ABS\*
000403bc R_MIPS_TLS_TPREL32 \*ABS\*
000403c0 R_MIPS_TLS_DTPMOD32 \*ABS\*
000403c8 R_MIPS_TLS_DTPMOD32 \*ABS\*
Contents of section .got:
403b0 00000000 80000000 00000000 00000000 ................
403c0 00000000 00000000 00000000 00000380 ................
403d0 00000008 00000000 00000000 00000000 ................
403e0 ffff8004 ....
403b0 00000000 80000000 00000380 00000008 ................
403c0 00000000 00000000 00000000 ffff8004 ................

View file

@ -4,14 +4,12 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
00040534 R_MIPS_TLS_DTPMOD32 \*ABS\*
0004053c R_MIPS_TLS_DTPMOD32 tlsvar_gd
00040540 R_MIPS_TLS_DTPREL32 tlsvar_gd
00040530 R_MIPS_TLS_TPREL32 tlsvar_ie
00040520 R_MIPS_TLS_DTPMOD32 \*ABS\*
00040528 R_MIPS_TLS_DTPMOD32 tlsvar_gd
0004052c R_MIPS_TLS_DTPREL32 tlsvar_gd
0004051c R_MIPS_TLS_TPREL32 tlsvar_ie
Contents of section .got:
40510 00000000 80000000 00000000 00000000 ................
40520 00000000 00000000 00000000 000004e0 ................
40530 00000000 00000000 00000000 00000000 ................
40540 00000000 ....
40510 00000000 80000000 000004e0 00000000 ................
40520 00000000 00000000 00000000 00000000 ................

View file

@ -11,14 +11,14 @@ Disassembly of section .text:
.*: afbe0008 sw s8,8\(sp\)
.*: 03a0f021 move s8,sp
.*: afbc0000 sw gp,0\(sp\)
.*: 8f99802c lw t9,-32724\(gp\)
.*: 2784803c addiu a0,gp,-32708
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848028 addiu a0,gp,-32728
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
.*: 00000000 nop
.*: 8f99802c lw t9,-32724\(gp\)
.*: 27848034 addiu a0,gp,-32716
.*: 8f998018 lw t9,-32744\(gp\)
.*: 27848020 addiu a0,gp,-32736
.*: 0320f809 jalr t9
.*: 00000000 nop
.*: 8fdc0000 lw gp,0\(s8\)
@ -27,7 +27,7 @@ Disassembly of section .text:
.*: 24638000 addiu v1,v1,-32768
.*: 00621821 addu v1,v1,v0
.*: 7c02283b rdhwr v0,\$5
.*: 8f838030 lw v1,-32720\(gp\)
.*: 8f83801c lw v1,-32740\(gp\)
.*: 00000000 nop
.*: 00621821 addu v1,v1,v0
.*: 03c0e821 move sp,s8

View file

@ -4,14 +4,12 @@ tmpdir/tlslib-o32.so: file format elf32-tradbigmips
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_MIPS_NONE \*ABS\*
00040494 R_MIPS_TLS_DTPMOD32 \*ABS\*
0004049c R_MIPS_TLS_DTPMOD32 tlsvar_gd
000404a0 R_MIPS_TLS_DTPREL32 tlsvar_gd
00040490 R_MIPS_TLS_TPREL32 tlsvar_ie
00040480 R_MIPS_TLS_DTPMOD32 \*ABS\*
00040488 R_MIPS_TLS_DTPMOD32 tlsvar_gd
0004048c R_MIPS_TLS_DTPREL32 tlsvar_gd
0004047c R_MIPS_TLS_TPREL32 tlsvar_ie
Contents of section .got:
40470 00000000 80000000 00000000 00000000 ................
40480 00000000 00000000 00000000 00000440 ................
40490 00000000 00000000 00000000 00000000 ................
404a0 00000000 ....
40470 00000000 80000000 00000440 00000000 ................
40480 00000000 00000000 00000000 00000000 ................