libdl: Add a local symbol table to the object module.

Adding a local symbol lets the relocator find local symbols referenced
in relocation records. The local symbol table is erased once the object
module has been loaded.
This commit is contained in:
Chris Johns
2014-11-04 12:12:25 +11:00
parent 53dd6d6130
commit a2e1e30d98
5 changed files with 202 additions and 96 deletions

View File

@@ -1,5 +1,5 @@
/*
* COPYRIGHT (c) 2012 Chris Johns <chrisj@rtems.org>
* COPYRIGHT (c) 2012-2014 Chris Johns <chrisj@rtems.org>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -208,9 +208,18 @@ rtems_rtl_symbol_obj_find (rtems_rtl_obj_t* obj, const char* name)
* Check the object file's symbols first. If not found search the
* global symbol table.
*/
for (s = 0, sym = obj->global_table; s < obj->global_syms; ++s, ++sym)
if (strcmp (name, sym->name) == 0)
return sym;
if (obj->local_syms)
{
for (s = 0, sym = obj->local_table; s < obj->local_syms; ++s, ++sym)
if (strcmp (name, sym->name) == 0)
return sym;
}
if (obj->global_syms)
{
for (s = 0, sym = obj->global_table; s < obj->global_syms; ++s, ++sym)
if (strcmp (name, sym->name) == 0)
return sym;
}
return rtems_rtl_symbol_global_find (name);
}
@@ -227,9 +236,22 @@ rtems_rtl_symbol_obj_add (rtems_rtl_obj_t* obj)
rtems_rtl_symbol_global_insert (symbols, sym);
}
void
rtems_rtl_symbol_obj_erase_local (rtems_rtl_obj_t* obj)
{
if (obj->local_table)
{
rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_SYMBOL, obj->local_table);
obj->local_table = NULL;
obj->local_size = 0;
obj->local_syms = 0;
}
}
void
rtems_rtl_symbol_obj_erase (rtems_rtl_obj_t* obj)
{
rtems_rtl_symbol_obj_erase_local (obj);
if (obj->global_table)
{
rtems_rtl_obj_sym_t* sym;