Weak symbols not overriden
Pan ruochen
panruochen@gmail.com
Thu Mar 17 08:11:00 GMT 2011
Hi All,
I found weak symbols wouldn't be overriden by the strong symbols with
same names.
Here is my test code.
$cat s1.c
extern void foo(void) __attribute__((weak, visibility("default")));
extern void function1(void) __attribute__((visibility("default")));
void foo(void) {
printf("Enter %s:%s\n", __FILE__,__FUNCTION__);
}
void function1(void) {
printf("Enter %s:%s\n", __FILE__,__FUNCTION__);
}
$cat s2.c
extern void foo(void) __attribute__((visibility("default")));
extern void function2(void) __attribute__((visibility("default")));
void foo(void) {
printf("Enter %s:%s\n", __FILE__,__FUNCTION__);
}
void function2(void) {
printf("Enter %s:%s\n", __FILE__,__FUNCTION__);
}
$cat main.c
extern void foo(void);
extern void function1(void);
extern void function2(void);
int main() {
foo();
function1();
function2();
return 0;
}
$gcc -fpic -shared -fvisibility=hidden -O2 -o libs1.so s1.c
$gcc -fpic -shared -fvisibility=hidden -O2 -o libs2.so s2.c
$gcc -O2 -o foo -Wl,-rpath=. main.c libs1.so libs2.so
$nm -D libs1.so
00000480 W foo
$nm -D libs2.so
00000480 T foo
$./foo
Enter s1.c:foo
Enter s1.c:function1
Enter s2.c:function2
The result means the `foo' function in libs1.so is called, not that in
libso2.so,
even if `foo' is a weak in libs1.so and is strong in libso2.so.
What's wrong?
PRC
Mar 17,2011
More information about the Binutils
mailing list