【问题标题】:Split generation of a Shared Object library (.so) file into two pass instead of one将共享对象库 (.so) 文件的生成拆分为两遍而不是一遍
【发布时间】:2016-10-16 11:46:07
【问题描述】:

我正在尝试从“test.c”和test.exp 文件构建一个共享库lib_test.so。这个lib_test.so 文件将用作另一个应用程序的扩展。 应用程序文档通过以下命令直接指定生成 tle lib_test.so 文件:

`gcc -q64 -o lib_test.so test.c -bM:Sre -bE:test.exp -bnoentry`

但我的要求是分两次构建库:

  1. 使用gcc命令编译生成test.o文件。
  2. 使用ld 命令生成库lib_test.so 的链接。

我尝试如下:

  1. 执行编译步骤如下:gcc -q64 -c -o test.o test.c
  2. 如下创建lib_test.sold -bM:Sre -bE:test.exp -bnoentry -o lib_test.so test.o

但它没有生成正确的lib_test.so 文件。

我正在使用带有最新 GCC 的 Ubuntu 16.04 LTS 64 位

您能否建议将流程分为两遍的正确方法...

感谢和问候。

【问题讨论】:

  • “它没有生成正确的lib_test.so 文件”是什么意思?你有构建错误吗?加载库时出错?还有什么?请详细说明。
  • 当我一次构建 lib_test.so 时,我得到了 12619 字节大小的 so 文件,并且应用程序可以很好地加载这个库,但是在使用两次构建时,输出 lib_test.so 文件是 11816 字节并且应用程序显示 loading extension failed for lib_test.so 错误。

标签: c linux gcc shared-libraries xlc


【解决方案1】:

您很少想使用ld 来执行链接。 gcc 前端在设置正确的标志等方面做得更好。所以,使用gcc

即而不是

ld -bM:Sre  -bE:test.exp -bnoentry -o lib_test.so test.o

gcc -bM:Sre  -bE:test.exp -bnoentry -o lib_test.so test.o

在您的第二步中。

【讨论】:

  • 我没有在构建库时手动运行这些命令的权限。我必须将我的代码(即test.ctest.exp)放置到指定目录,并在makefile 中添加CFLAGS=<pass 1>LDFLAGS=<pass 2>,然后应用程序运行gcc -c ${CFLAGS} -o ${OFILE} ${IFILE} 来编译和生成test.o,然后运行ld ${LDFLAGS} -o ${SOFILE} ${OFILE}。所有这些都是在内部完成的,我只需要使用 ``gcc` 和 ld 给出正确的标志来获得 lib_test.so 所以我要求构建两遍。
【解决方案2】:

与 GCC 前端程序 gcc 链接和与实际链接器 ld 链接的最大区别在于 GCC 前端添加了一些要链接的库。最值得注意的是 GCC 运行时库(-lgcc_s-lgcc)和实际的标准 C 库(@​​987654325@)。

当您直接调用 ld 时,您不会告诉它与这些库链接。

在您不知情的情况下,GCC 前端可能还会将其他库和标志传递给ld。对于“一次通过”构建,将标志 -v 传递给 gcc 以获得详细输出,并查看它使用了哪些参数、标志和库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多