写文件,一个是弱文件,另一个是普通符号。以下是文件的内容: 其中 weak_ex() 是用弱符号声明的定义。
bgl-ads-2997:~/weak_symbol > cat mc
#include <stdio.h>
#include "weak.h"
void main (){
printf ("weak = %d\n", weak_ex());
}
bgl-ads-2997:~/weak_symbol > cat weak.c
int __attribute__((weak)) weak_ex()
{
return 1;
}
bgl-ads-2997:~/weak_symbol > cat strong.c
int weak_ex()
{
return 10;
}
bgl-ads-2997:~/weak_symbol > cat weak.h
int weak_ex();
所以使用上述定义,弱符号将返回 1,而强符号将返回 10。
他们将它们编译如下:
gcc -g -c -o m.o m.c
gcc -g -c -o weak.o weak.c
gcc -g -c -o strong.o strong.c
gcc -shared -fpic -o libstrong.so strong.o
gcc -shared -fpic -o libweak.so weak.o
然后链接它们并执行如下:
仅使用目标文件:
bgl-ads-2997:~/weak_symbol > gcc mo weak.o strong.o -L -Wl
pwd
,-Rpwd
-o sharedbgl-ads-2997:~/weak_symbol > ./shared
弱 = 10
在这种情况下,弱符号被屏蔽。和预期的一样强信号。
与对象文件中的星期符号和共享对象中的强符号链接。
bgl-ads-2997:~/weak_symbol > gcc -lstrong mo weak.o -L -Wl
pwd
,-Rpwd
-o sharedbgl-ads-2997:~/weak_symbol > ./shared
弱 = 1
在这种情况下,弱符号不会被替换。
似乎符号在编译时被解析,而不是作为执行的一部分,不考虑共享期望这也打印 10 但不是这样,那么这是预期的行为吗?有没有办法从共享库中替换周符号?