【发布时间】:2010-08-11 15:09:03
【问题描述】:
我创建了一个 .c 文件,该文件与大约 300 个其他 .c 文件一起转换为 .o 文件,并包含在 .a 静态库中。该库与许多其他库一起用于创建.so 动态库。在使用nm 分析.a 和.so 文件时,我发现由于某种原因,.c 文件中定义的符号出现在.a 文件中,但不在.so 文件中。我想不出为什么会发生这种情况。有人可以帮我吗?用于创建这两个二进制文件的步骤是:
gcc -fvisibility=hidden -c foo.c -o foo.c.o
ar cr libbar.a foo.c.o ...
gcc -fvisibility=hidden -fPIC -o libfinal.so libbar.a x.o y.a ...
我在这里指定可见性隐藏的原因是我只想公开几个选定的符号。为了从foo.c 中公开符号,我指定了可见性属性,以便标头foo.h 中的函数签名看起来像:
extern int _____attribute_____ ((visibility ("default"))) func();
编辑:命令nm libbar.a | grep Ctx 给出:
000023c5 T CtxAcquireBitmap
000026e9 T CtxAcquireArray
00001e77 T CtxCallMethod
但是,nm libfinal.so | grep Ctx 没有显示任何内容。
更新:找到另一个post,它讨论了--whole-archive 选项的用法。此外,偶然发现了--export-dynamicoption,它显然告诉链接器保留未引用的符号。进一步调查。
【问题讨论】:
-
能否请您向我们展示一些
nm的输出,以明确区别?而且我们可以看到这些符号的“类型”消失了。 -
-fPIC选项仅在编译时生效,在链接时不生效。因此,除非您在编译时使用-fPIC,否则您最终会得到一个非PIC 共享库。这意味着每个实例将使用更多内存(大多数页面无法共享),甚至在某些系统(如 x86_64)上也无法运行。 -
用信息更新了问题。
-
@sylvainulg 给出的answer 告诉你出了什么问题。如果您没有在任何地方使用任何可见性属性,您仍然会遇到同样的问题。
-
那么我如何包含那些打算被导出以供另一个
.so或可执行文件使用但在.so中未引用的符号?不能使用导出文件。
标签: c linux gcc shared-libraries