我的共享库libnew.so
使用了已构建的第三方共享库中的一些符号libold.so
。我想构建一个可执行的二进制文件,该文件只能链接到libnew.so
.但它仍然需要链接到libold.so
也。否则,链接器会抱怨undefined reference to symbol...
.
我使用这些命令来构建libnew.so
可执行文件。由于某种原因,只允许使用当前目录,而我不能将文件放在其他地方。
顺便说一句,显示未定义的nm libnew.so
符号。也不报告任何。如果我不用于构建,则大小不会改变!libold.so
ldd libnew.so
libold.so
libold.so
libnew.so
libnew.so
对于 libnew.so :
gcc -Wall -fPIC -c libnew.c
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
ln -sf libnew.so.1.0 libnew.so.1
ln -sf libnew.so.1.0 libnew.so
对于可执行文件:
#this does not work and needs -lold as well.
gcc -Wall main.c -L. -lnew -o prog
有什么遗漏吗?谢谢!
答案1
缺少的是你的链接器命令
gcc -shared -Wl,-soname,libnew.so.1 -o libnew.so.1.0 *.o -L. -lold
才不是复制来自 的对象libold.so
,但是指的是该文件中的符号告诉动态加载器在哪里可以获取这些符号。
通常,当有人试图抑制/隐藏给定的库时,他们首先重新组合用于创建共享库的对象文件。你可能能够通过以下方式完成此任务部分链接,但我没有看到解决方案(因为共享库和共享对象不可互换)。
进一步阅读:
- 合并多个.so共享库(说这行不通……)
- GNU 链接器中的部分链接是什么?
ld
- GNU 链接器