Linker 有没有办法在运行时检测库是否静态链接?
我有一种情况,我发行了一个库,它使用符号插入来处理一些Linker 有没有办法在运行时检测库是否静态链接?,linker,ld,dlsym,Linker,Ld,Dlsym,我有一种情况,我发行了一个库,它使用符号插入来处理一些stdlib.h函数,例如malloc。我通常只使用标准的psymbol=dlsym(RTDL_NEXT,“symbol”)技术 不过,我有一些用户希望构建静态链接的二进制文件,而RTLD_NEXT在该上下文中无效---dlsym不仅在该上下文中失败,而且在未动态加载的代码中使用RTLD_NEXT时退出。我可以强制这些用户使用-Wl,--wrap,symbol方法,并提供适当的\uuuu real\u symbol,\u wrap\u sym
stdlib.h
函数,例如malloc
。我通常只使用标准的psymbol=dlsym(RTDL_NEXT,“symbol”)
技术
不过,我有一些用户希望构建静态链接的二进制文件,而RTLD_NEXT
在该上下文中无效---dlsym不仅在该上下文中失败,而且在未动态加载的代码中使用RTLD_NEXT时退出。我可以强制这些用户使用-Wl,--wrap,symbol
方法,并提供适当的\uuuu real\u symbol,\u wrap\u symbol
对,因为他们使用pkg config
链接到我的库
我可以一直使用链接器包装解决方案,但是我遇到了一个问题,我的一个可选库依赖项(Open MPI
)也尝试包装相同的符号,但是使用了RTLD\u NEXT
方法——这似乎优先于ld
包装选项
我当然可以实现这两个选项,并在配置Open MPI
时静态选择dlsym
方法(Open MPI
阻止-static
链接)。问题是,我不确定这是否是唯一一个试图插入我的符号的库
是否有一种方法可以将这两个选项编译到我的库中(即\uuuu real\u symbol
和\uuu wrap\u symbol
用于-static
链接,以及symbol
和psymbol
用于dlsym
),在静态链接期间强制使用-Wl,--wrap,symbol
标志(通过pkg config--static--cflags
),并动态检查RTLD\u NEXT
当前是否可用?这样我就可以构建一个在两种上下文中都能工作的库