我试图了解ld-linux.so如何解析对Linux上版本化符号的引用。我有以下文件:
测试C:
void f();
int main()
{
f();
}
A.C和B.C:
void f() {}
符号.txt:
ABC {
global:
*;
};
生成文件:
all: liba.so libb.so test
liba.so: a.c
gcc -g -shared $^ -o $@ -Wl,--version-script=symbols.txt
libb.so: b.c
gcc -g -shared $^ -o $@
test: test.c liba.so
gcc -g test.c -la -L. -o $@
clean:
rm -f liba.so libb.so test
然后我运行以下命令
LD_PRELOAD=./libb.so LD_LIBRARY_PATH=. ./test
我发现b.c中的f()被调用,即使libb.so中的符号f没有test(f@abc)所要求的版本。为什么会这样?
最佳答案
版本脚本用于限制要在共享库中导出的符号。这意味着更快的链接速度和很少的符号冲突的变化。
默认情况下,大多数函数名都将被导出,因此您可以毫无问题地与libb.so链接。
如果要确定应使用哪个版本的函数,则需要在程序中指定它。这需要一些程序集代码来指定.symver。
欲了解更多详情,请阅读Ulrich Dreper的论文https://www.akkadia.org/drepper/dsohowto.pdf
关于linux - Linux ld-linux.so中版本化的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57775997/