我遇到的情况是我分发了一个使用符号插入来处理某些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
当前是否可用?这样我就可以构建一个在两种上下文中都有效的库。