gpt4 book ai didi

linux - Linux ld-linux.so 的版本化符号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:24 35 4
gpt4 key购买 nike

我试图了解 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

我发现即使 libb.so 中的符号 f 没有 testf()>(f@ABC)。为什么会这样?

最佳答案

版本脚本用于限制共享库中要导出的符号。这意味着更快的链接速度和很少的符号冲突变化。

默认情况下,大多数函数名将被导出,因此您可以毫无问题地与 libb.so 链接。

如果你想确定应该使用哪个版本的函数,你需要在你的程序中指定它。这需要一些汇编代码来指定 .symver。

更多细节,请阅读 Ulrich Drepper 的论文 https://www.akkadia.org/drepper/dsohowto.pdf

关于linux - Linux ld-linux.so 的版本化符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57775997/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com