summaryrefslogtreecommitdiff
path: root/rtl-rap.c
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2012-12-18 20:38:53 +1100
committerChris Johns <chrisj@rtems.org>2012-12-18 20:38:53 +1100
commita393008436d6a5c00956eee0f371c71363c06ae2 (patch)
tree8fed1a4a04ff78863f6729735df0e54f0a7843b9 /rtl-rap.c
parent16de1256c028588c7e2159801d3c70a9a0e432b2 (diff)
Fix string handling of symbols.
The string handling of symbols was wrong. This has been fixed. Add some more trace output to help debugging.
Diffstat (limited to 'rtl-rap.c')
-rw-r--r--rtl-rap.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/rtl-rap.c b/rtl-rap.c
index c5de26f..c5bde83 100644
--- a/rtl-rap.c
+++ b/rtl-rap.c
@@ -197,6 +197,11 @@ rtems_rtl_rap_loader (rtems_rtl_obj_t* obj,
void* data)
{
rtems_rtl_rap_t* rap = (rtems_rtl_rap_t*) data;
+
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: input %s=%lu\n",
+ sect->name, rtems_rtl_obj_comp_input (rap->decomp));
+
return rtems_rtl_obj_comp_read (rap->decomp, sect->base, sect->size);
}
@@ -409,7 +414,6 @@ rtems_rtl_rap_relocate (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
static bool
rtems_rtl_rap_load_symbols (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
{
- char* string;
rtems_rtl_obj_sym_t* gsym;
int sym;
@@ -427,10 +431,10 @@ rtems_rtl_rap_load_symbols (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
obj->global_syms = rap->symbols;
- rap->strtab = string = (((char*) obj->global_table) +
- (rap->symbols * sizeof (rtems_rtl_obj_sym_t)));
+ rap->strtab = (((char*) obj->global_table) +
+ (rap->symbols * sizeof (rtems_rtl_obj_sym_t)));
- if (!rtems_rtl_obj_comp_read (rap->decomp, string, rap->strtab_size))
+ if (!rtems_rtl_obj_comp_read (rap->decomp, rap->strtab, rap->strtab_size))
return false;
for (sym = 0, gsym = obj->global_table; sym < rap->symbols; ++sym)
@@ -462,14 +466,15 @@ rtems_rtl_rap_load_symbols (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
* present take this symbol global or weak. We accept the first weak
* symbol we find and make it globally exported.
*/
- if (rtems_rtl_symbol_global_find (string) &&
+ if (rtems_rtl_symbol_global_find (rap->strtab + name) &&
(ELF_ST_BIND (data & 0xffff) != STB_WEAK))
{
free (obj->global_table);
obj->global_table = NULL;
obj->global_syms = 0;
obj->global_size = 0;
- rtems_rtl_set_error (EINVAL, "duplicate global symbol: %s", string);
+ rtems_rtl_set_error (EINVAL,
+ "duplicate global symbol: %s", rap->strtab + name);
return false;
}
@@ -485,7 +490,7 @@ rtems_rtl_rap_load_symbols (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
}
rtems_chain_set_off_chain (&gsym->node);
- gsym->name = string;
+ gsym->name = rap->strtab + name;
gsym->value = (uint8_t*) (value + symsect->base);
gsym->data = data & 0xffff;
@@ -496,7 +501,6 @@ rtems_rtl_rap_load_symbols (rtems_rtl_rap_t* rap, rtems_rtl_obj_t* obj)
(int) ELF_ST_TYPE (data & 0xffff),
gsym->value, (int) (data >> 16));
- string += strlen (string) + 1;
++gsym;
}
@@ -655,6 +659,10 @@ rtems_rtl_rap_file_load (rtems_rtl_obj_t* obj, int fd)
* uint32_t: class
*/
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: input machine=%lu\n",
+ rtems_rtl_obj_comp_input (rap.decomp));
+
if (!rtems_rtl_rap_read_uint32 (rap.decomp, &rap.machinetype))
return false;
@@ -699,6 +707,10 @@ rtems_rtl_rap_file_load (rtems_rtl_obj_t* obj, int fd)
* uint32_t: relocs_size
*/
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: input header=%lu\n",
+ rtems_rtl_obj_comp_input (rap.decomp));
+
if (!rtems_rtl_rap_read_uint32 (rap.decomp, &rap.init))
return false;
@@ -716,6 +728,11 @@ rtems_rtl_rap_file_load (rtems_rtl_obj_t* obj, int fd)
rap.symbols = rap.symtab_size / (3 * sizeof (uint32_t));
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: load: symtab=%lu (%lu) strtab=%lu relocs=%lu\n",
+ rap.symtab_size, rap.symbols,
+ rap.strtab_size, rap.relocs_size);
+
/*
* uint32_t: text_size
* uint32_t: text_alignment
@@ -761,9 +778,17 @@ rtems_rtl_rap_file_load (rtems_rtl_obj_t* obj, int fd)
if (!rtems_rtl_obj_load_sections (obj, fd, rtems_rtl_rap_loader, &rap))
return false;
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: input symbols=%lu\n",
+ rtems_rtl_obj_comp_input (rap.decomp));
+
if (!rtems_rtl_rap_load_symbols (&rap, obj))
return false;
+ if (rtems_rtl_trace (RTEMS_RTL_TRACE_LOAD))
+ printf ("rtl: rap: input relocs=%lu\n",
+ rtems_rtl_obj_comp_input (rap.decomp));
+
if (!rtems_rtl_rap_relocate (&rap, obj))
return false;