1

我有一个带有弱符号的二进制文件,我希望能够在运行时将其与运行相关的共享库链接。

$nm testrun
...         
w basic2.test
...

我的第一个测试是.o在静态链接时使用一个文件,该文件有效,但我需要共享它。

因此,我的第二个测试是获得一个定义了该符号的共享库,并在编译时将其与-lmy(libmy.so) 链接,这实际上也很有效。

第三步尝试在编译时不链接并使用 ld_preload 技巧,但这不起作用。

nm libmy.so
...
00000550 T basic2.test
...

我真的不知道为什么这个特定的不工作,看起来动态加载器应该有足够的信息来使用 libmy.so 中的那个设置 testruns 弱符号。

我的最终目标,我想这需要更多的工作是在启动时加载一个小函数,该函数使用 dlsym 检查适当的符号并将其设置在那里。

有什么提示吗?

4

1 回答 1

3

看来您可能需要与手册LD_DYNAMIC_WEAK一起使用:LD_PRELOAD

LD_DYNAMIC_WEAK(自 2.1.91 以来的 glibc)允许覆盖弱符号(恢复到旧的 glibc 行为)。出于安全原因,从 glibc 2.3.4 开始,对于 set-user-ID/set-group-ID 二进制文件,LD_DYNAMIC_WEAK 将被忽略。

注意:这可能是一个错字,但你应该使用-lmylib.so而不是-Lmylib.so

于 2012-11-21T15:31:22.937 回答