Broken Code in gas/symbols.c
Ravi
ravi@codito.com
Thu Sep 30 14:00:00 GMT 2004
Hi,
I was going over some of the binutils 2.15 code when I came across the
following code :
<snip: gas/symbols.c>
void
symbol_mark_used_in_reloc (symbolS *s)
{
if (LOCAL_SYMBOL_CHECK (s))
s = local_symbol_convert ((struct local_symbol *) s);
s->sy_used_in_reloc = 1;
}
</snip: gas/symbols.c>
Now local_symbol_convert creates a 'struct symbol' from a 'struct
local_symbol' by doing a malloc. Since the function takes the pointer to
a 'struct symbol', the newly created 'struct local symbol' does not get
returned to the calling function.
The two options to make the newly created 'struct local symbol'
available to the caller is either returning the value of the 'struct
local symbol' or passing the 'struct symbol' by reference. The former
would tend to break the consistency between all the functions defined in
symbols.c as some of the functions already return values of their own.
This leaves us with the second option of passing the 'struct symbol' by
reference for all the functions in gas/symbols.c. For example the
function symbol_mark_used_in_reloc would be changed to:
</snip: gas/symbols.h>
extern void symbol_mark_used_in_reloc (symbolS **);
</snip: gas/symbols.h>
<snip: gas/symbols.c>
void
symbol_mark_used_in_reloc (symbolS **s)
{
symbolS *t = *s;
if (LOCAL_SYMBOL_CHECK (t))
t = local_symbol_convert ((struct local_symbol *) t);
t->sy_used_in_reloc = 1;
*s = t;
}
</snip: gas/symbols.c>
When I built the 2.15 sources for an arc-elf32 target I got the
following problem:
<snip>
ravi@firebolt:/overflow/crap/tests$ cat test.s
.section .rodata.str, "aMS", @progbits, 1
.LC3: .string "main"
.section .text
mov r0, .LC3+1
ravi@firebolt:/overflow/crap/tests$
/overflow/crap/install/bin/arc-elf32-as test.s
Segmentation fault
ravi@firebolt:/overflow/crap/tests$
</snip>
My solution seems to solve this problem. Is this the best way of going
about it though ?
Regards,
Ravi Ramaseshan.
More information about the Binutils
mailing list