Linux ld-Linux.so版本符号

Linux ld-Linux.so版本符号,linux,gcc,ld,Linux,Gcc,Ld,我试图理解ld-linux.so如何解析linux上对版本符号的引用。我有以下文件: 测试c: void f(); int main() { f(); } a、 c和b.c: void f() {} symbols.txt: ABC { global: *; }; 生成文件: all: liba.so libb.so test liba.so: a.c gcc -g -shared $^ -o $@ -Wl,--version-script=sy

我试图理解ld-linux.so如何解析linux上对版本符号的引用。我有以下文件:

测试c:

void f();

int main()
{
    f();
}
a、 c和b.c:

void f() {}
symbols.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没有测试所需的版本,也会调用b.c中的f()(f@ABC). 为什么会发生这种情况?

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

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

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


有关更多详细信息,请阅读Ulrich Drepper的论文

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

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

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

欲知更多详情,请阅读Ulrich Drepper的论文