代码之家  ›  专栏  ›  技术社区  ›  341008 Sylvain

.a中的对象文件不包括在.so中

  •  4
  • 341008 Sylvain  · 技术社区  · 14 年前

    我创造了一个 .c 正在转换为 .o 和大约300个其他人一起归档 c 文件和包含在 .a 静态库。这个库和其他许多库一起被用来创建一个 .so 以及 文件 nm c a 所以呢 文件。我想不出发生这种事的理由。有人能帮帮我吗?创建这两个二进制文件的步骤如下:

    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 我已经指定了visibility属性,以便函数在头中签名 foo.h

    extern int uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

    nm libbar.a | grep Ctx 给予:

    000023c5 T CtxAcquireBitmap
    000026e9 T CtxAcquireArray
    00001e77 T CtxCallMethod
    

    然而, nm libfinal.so | grep Ctx 没有显示任何内容。

    post 讨论了 --whole-archive 选项。还有,偶然发现 --export-dynamic 选项,它显然告诉链接器保留未引用的符号。进一步调查。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Dmitry Yudakov    14 年前

    尝试使用 --whole-archive 链接器选项,用于在链接时将所有对象包含到共享库中

    gcc -o libfinal.so -Wl,--whole-archive libbar.a x.o y.a -Wl,--no-whole-archive
    

    man ld :

    --整个档案馆
    链接,而不是在存档中搜索所需的对象文件。这通常用于将存档文件转换为共享文件

    从gcc使用此选项时需要注意两个问题:首先,gcc不知道此选项,因此必须使用-Wl,-whole archive。 其次, ,因为gcc会将自己的存档列表添加到 链接,您可能不希望此标志也影响这些。

        2
  •  1
  •   PypeBros vinay hunachyal    14 年前

    据我所知,在对a.a进行编译时,gcc只会提取其他模块引用的对象。如果您的意图是将.a的全部内容包含在.so中,那么可以使用一个简单的“compile/link x.c into”libfinal.so 使用libbar.a中的内容不是你想要的。

        3
  •  -1
  •   341008 Sylvain    14 年前

    在我的主文件中为所需的符号创建虚拟引用并没有解决问题。引用的符号出现在二进制转储中(使用 nm )带着 U (=未定义)标记。我在创建 .so 而不是将其包含在 .a 图书馆优先。因为这些功能被标记了 extern 即使图书馆没有引用它们。他们没有被标记吗

    感谢德米特里指出 --whole-archive 选项。我不知道这样的选择是否存在。