On Mon, Aug 13, 2012 at 9:53 PM, WANG.Jiong <firstname.lastname@example.org> wrote:
On 08/14/2012 12:39 PM, Ian Lance Taylor wrote:
On Mon, Aug 13, 2012 at 8:30 PM, Jiong WANG <email@example.com>
2012/8/13 Ian Lance Taylor <firstname.lastname@example.org>:
I'm sorry, I don't understand what you mean.
Hi Ian & all, thanks for your suggestion.
On Mon, Aug 13, 2012 at 3:25 AM, Jiong WANG <email@example.com>
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:
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
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.
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.
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
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
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
this is my problem.
I see. So you have a relocation type that refers to a symbol with a
magic name. That seems like a bad design to me. Can you change it?
If you can't change it, there is a phase ordering problem. Gold reads
all the symbol tables, including fetching objects out of archives,
before it does the relocation processing. You will only know that you
need the symbol when you are doing relocation processing. At that
time, it is too late.
As far as I can see, you will have to make the symbol always be
undefined, as though the linker were always invoke with -u
__tls_get_addr. That will cause the object defining the symbol to
always be brought into the link, but I don't see how to avoid that.
You just need to call symtab->add_undefined_symbol_from_command_line,
one way or another, and you need to do it early in the link, e.g.,
when your Target is constructed.