So then is a binutils and not a compiler problem. What binutils are you
using? Binutils 2.8.1 which I'm still recommending (mostly to avoid
sending people into a maze of version dependencies) is getting dated and
the bug may well have been fixed in the meantime.
I have met a weird bug in binutils 2.8.1 on mips lately: when using
".weak" directive in some module which make use of the same asliased
symbol, during linkage the symbol doesn't get relocated to a "strong"
symbol:
----------------------
in foo.c:
----------------------
extern void bar();
void foo(){
printf("A\n");
}
__asm__(".weak bar; bar = foo");
void f1(){
bar();
}
-----------------------
in bar.c:
----------------------
void bar(){
printf("B\n");
}
----------------------
in main.c:
----------------------
extern void bar();
extern void f1();
int main(){
f1();
bar();
}
-----------------------
This code produce printout of
A
B
since f1() always calls foo() no matter that bar() is defined outside.
AFIAIK, there is no ".weakext" macro in 2.8.1.
Using objdump on foo.o I see there is no relocation entry for bar,
however using gas-2.10 on exactly same assembly does produce relocation
entry. So it must definitely be a "gas" problem.
Sincerely yours,
Michael Shmulevich
______________________________________
Software Developer
Jungo - R&D
email: michaels@jungo.com
web: http://www.jungo.com
Phone: 1-877-514-0537(USA) +972-9-8859365(Worldwide) ext. 233
Fax: 1-877-514-0538(USA) +972-9-8859366(Worldwide)
|