我在我的代码中使用函数regcomp()。我的代码链接libonig.so以及libc.so.6。 这两个库都有自己的regcomp()实现,但我想使用libonig.so的实现。但是,我的代码总是使用libc.so.6中的实现。 ldd的输出如下 -
ldd libtest.so
linux-vdso.so.1 => (0x00007fffa03ff000)
libonig.so.2 => /usr/local/lib/libonig.so.2 (0x00007f5cb2fbf000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f12a43cf000)
libm.so.6 => /lib64/libm.so.6 (0x00007f12a414c000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f12a3f36000)
libc.so.6 => /lib64/libc.so.6 (0x00007f12a3be1000)
/lib64/ld-linux-x86-64.so.2 (0x0000003421c00000)
我不允许修改任何libonig.so或libc.so.6。有没有办法指定链接器应该从libonig.so使用regcomp()?
答案 0 :(得分:0)
刚刚解决了这个问题。我实际上是使用dlopen()来加载共享对象(libtest.so)。所以我应该将libonig.so链接到正在加载libtest.so的二进制文件。
另一方面,我试图将libonig.so链接到libtest.so。但是当二进制文件运行时,它从libc.so.6获得了regcomp()的版本,并且认为没有必要用libonig.so解析符号。链接libonig.so并在LD_LIBRARY_PATH中包含其路径解决了这个问题。