Add TLS load module support for FRV.

This commit is contained in:
Kevin Buettner
2005-03-31 20:39:14 +00:00
parent b275693032
commit 186993b458
4 changed files with 57 additions and 0 deletions

View File

@@ -201,6 +201,8 @@ struct lm_info
struct int_elf32_fdpic_loadmap *map;
/* The GOT address for this link map entry. */
CORE_ADDR got_value;
/* The link map address, needed for frv_fetch_objfile_link_map(). */
CORE_ADDR lm_addr;
/* Cached dynamic symbol table and dynamic relocs initialized and
used only by find_canonical_descriptor_in_load_object().
@@ -341,6 +343,9 @@ open_symbol_file_object (void *from_ttyp)
/* Cached value for lm_base(), below. */
static CORE_ADDR lm_base_cache = 0;
/* Link map address for main module. */
static CORE_ADDR main_lm_addr = 0;
/* Return the address from which the link map chain may be found. On
the FR-V, this may be found in a number of ways. Assuming that the
main executable has already been relocated, the easiest way to find
@@ -467,6 +472,7 @@ frv_current_sos (void)
sop->lm_info = xcalloc (1, sizeof (struct lm_info));
sop->lm_info->map = loadmap;
sop->lm_info->got_value = got_addr;
sop->lm_info->lm_addr = lm_addr;
/* Fetch the name. */
addr = extract_unsigned_integer (&lm_buf.l_name,
sizeof (lm_buf.l_name));
@@ -491,6 +497,10 @@ frv_current_sos (void)
*sos_next_ptr = sop;
sos_next_ptr = &sop->next;
}
else
{
main_lm_addr = lm_addr;
}
lm_addr = extract_unsigned_integer (&lm_buf.l_next, sizeof (lm_buf.l_next));
}
@@ -949,6 +959,7 @@ frv_clear_solib (void)
lm_base_cache = 0;
enable_break1_done = 0;
enable_break2_done = 0;
main_lm_addr = 0;
}
static void
@@ -1200,6 +1211,33 @@ find_canonical_descriptor_in_load_object
return addr;
}
/* Given an objfile, return the address of its link map. This value is
needed for TLS support. */
CORE_ADDR
frv_fetch_objfile_link_map (struct objfile *objfile)
{
struct so_list *so;
/* Cause frv_current_sos() to be run if it hasn't been already. */
if (main_lm_addr == 0)
solib_add (0, 0, 0, 1);
/* frv_current_sos() will set main_lm_addr for the main executable. */
if (objfile == symfile_objfile)
return main_lm_addr;
/* The other link map addresses may be found by examining the list
of shared libraries. */
for (so = master_so_list (); so; so = so->next)
{
if (so->objfile == objfile)
return so->lm_info->lm_addr;
}
/* Not found! */
return 0;
}
static struct target_so_ops frv_so_ops;
void