有没有办法在运行时检测库是否静态链接?

时间:2015-12-30 20:03:43

标签: linker ld dlsym

我遇到的情况是我分发了一个使用符号插入来处理某些stdlib.h函数的库,例如malloc。我通常会使用标准psymbol = dlsym(RTDL_NEXT,"symbol")技术as described here

我有一些用户希望构建静态链接的二进制文件,并且RTLD_NEXT在该上下文中无效 - dlsym在该上下文中不会失败,它以 RTLD_NEXT退出,代码中没有动态加载。我可以强制这些用户使用-Wl,--wrap,symbol方法described here,并提供相应的__real_symbol,_wrap_symbol对,因为他们正在使用pkg-config链接到我的库。

总是使用链接器包装解决方案对我来说没关系,但是我有一个问题,我的可选库依赖项之一(Open MPI)也试图包装相同的符号,但是正在使用{ {1}}方法---这似乎优先于RTLD_NEXT换行选项。

我当然可以实现这两个选项,并在配置ld时静态选择dlsym方法(Open MPI无论如何都会阻止Open MPI链接)。问题是,我不确定这是否是唯一试图插入符号的库。

有没有办法可以将两个选项都编译到我的库中(例如,-static__real_symbol用于__wrap_symbol链接,-static和{{1} } symbol},在静态链接期间强制*psymbol标记(通过dlsym),并动态检查-Wl,--wrap,symbol当前是否可用?这样我就可以构建一个在两种上下文中都有效的库。

0 个答案:

没有答案