[GOLD] How can I add a undefined symbol in target implementation, not by "-u SYM" from command line ?
WANG.Jiong
wong.kwongyuan@gmail.com
Tue Aug 14 05:26:00 GMT 2012
On 08/14/2012 12:39 PM, Ian Lance Taylor wrote:
> On Mon, Aug 13, 2012 at 8:30 PM, Jiong WANG <wong.kwongyuan@gmail.com> wrote:
>> 2012/8/13 Ian Lance Taylor <iant@google.com>:
>>> On Mon, Aug 13, 2012 at 3:25 AM, Jiong WANG <wong.kwongyuan@gmail.com> wrote:
>>>> How can I predefine a undefined symbol in target implementation?
>>>>
>>>> actually, I am porting gold for tilegx, and our arch's tls
>>>> implementation requires predefiniation of "_tls_get_addr" because the
>>>> assembler generate relocation which use this symbol implicitly.
>>>>
>>>> I know there are interfaces, "define_in_output_data/segment" to
>>>> predefined symbol with value, but there is no interface to predefine
>>>> "undefined" symbol ?
>>>>
>>>> gold linker do support this by command line "-u SYMBOL", but it's
>>>> a compile time decision not link time.
>>>>
>>>> currently, I managed to support this by the following ugly code:
>>>>
>>>> options::parse_set(NULL, "_tls_get_addr",
>>>> (gold::options::String_set*)¶meters->options().undefined());
>>>>
>>>> which is bad, so, could anyone give me some suggestion on this?
>>>
>>> I assume that the symbol is defined somewhere. You probably want to
>>> add a do_is_defined_by_abi method to your Target. See the examples in
>>> existing targets.
>> Hi Ian & all, thanks for your suggestion.
>>
>> I have explored do_is_defined_by_abi, and found it's mostly to avoid
>> warning, but not for creating such a symbol
>>
>> do_is_defined_by_abi has one argument of the type "const Symbol*", so
>> when it's invoked, that symbol should already existed.
>> ...
>> basically, I want to create a symbol which is neither against
>> section or segment, just a normally external function symbol.
> I'm sorry, I don't understand what you mean.
>
> If there is no reference to __tls_get_addr in the object files, why do
> you care whether it is defined?
>
> If there is a reference in the object files, then where is it defined?
>
> You seem to be asking how to create an undefined symbol, as though
> used with the -u option. But that makes no sense. Why would you want
> that? The purpose of the -u option is to add a reference to a symbol
> in order to fetch the definition from an archive.
Hi Ian,
thanks for reply.
suppose the following code:
__thread int gd_v = 0x10;
int cal(int a)
{
return a + gd_v;
}
tilegx gcc will generate the following relocation:
jal tls_gd_call(gd_v), tls_gd_call will actually need linker to
treat it like plt@__tls_get_addr
while all other arch, arm/mips/x86 etc, will generate relocation against
__tls_get_addr explictly
so, for tilegx arch, the symbol "__tls_get_addr" will not exist in the
.o file, while for other arches, it will.
from my understanding, I need to do the following two thing for tilegx arch:
1. when scaned the tls_gd_call relocation, I need to create the
symbol "__tls_get_addr", and
make a plt entry for it.
2. when apply relation for tls_gd_call, make the jal instruction
jump to plt entry for "__tls_get_addr"
I found there are interfaces like define_in_output_data etc which could
predefine symbol, but It seems
they can not defined a symbol with GLOBAL/UND type which is the type of
"__tls_get_addr"
this is my problem.
please point out if there are any mistunderstood
thanks
---
Regards,
WANG.Jiong
>
> Ian
More information about the Binutils
mailing list