【问题标题】:versioned symbols with Linux ld-linux.soLinux ld-linux.so 的版本化符号
【发布时间】:2019-09-03 17:01:12
【问题描述】:

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

test.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

我发现调用了来自 b.c 的 f(),即使 libb.so 中的符号 f 没有 test所需的版本> (f@ABC)。为什么会这样?

【问题讨论】:

    标签: linux gcc ld


    【解决方案1】:

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

    默认情况下,大部分函数名都会被导出,所以你可以毫无问题地与 libb.so 链接。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多