我可以让 gcc 在链接共享库时忽略静态库吗?

发布于 2024-11-17 15:19:16 字数 319 浏览 1 评论 0原文

我遇到过一些构建使用共享库或动态加载模块的项目的情况,其中模块/库依赖于另一个库,但在尝试链接之前不检查共享副本是否可用。这会导致静态存档(.a 文件)中的目标文件被拉入生成的 .so,并且由于这些目标文件是非 PIC,生成的 .so 文件要么有 TEXTREL(加载性能和内存使用非常糟糕),要么完全失败(在像 x86_64 这样不支持非 PIC 共享库的架构上)。

有什么办法可以让 gcc 编译器驱动程序拒绝将静态库代码链接到共享库输出中吗?由于可能需要从 libgcc.a 等链接最少的数量,这似乎很困难且复杂......

I've encountered a few cases building projects which use shared libraries or dynamic-loaded modules where the module/library depends on another library, but doesn't check that a shared copy is available before trying to link. This causes object files from a static archive (.a file) to get pulled into the resulting .so, and since these object files are non-PIC, the resulting .so file either has TEXTRELs (very bad load performance and memory usage) or fails altogether (on archs like x86_64 that don't support non-PIC shared libraries).

Is there any way I can make the gcc compiler driver refuse to link static library code into shared library output? It seems difficult and complicated by the possible need to link minimal amounts from libgcc.a and the like...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南薇 2024-11-24 15:19:16

如您所知,您可以使用 -static 仅链接到静态库,但似乎没有一个很好的等效项仅链接到动态库。

以下答案可能有用...

如何要使用 GCC 进行链接而不使用 -l 或对不遵循 libNAME.so 命名约定的库进行硬编码路径吗?

您可以使用 -l:[libraryname].so 列出要链接到的动态库您的图书馆搜索路径。指定 .so 结尾可能会对仅动态库的情况有所帮助。您可能必须指定带有“lib”前缀的完整名称,而不仅仅是缩写版本。

As you know, you can use -static to only link against static libraries, but there doesn't appear to be a good equivalent to only linking against dynamic libraries.

The following answer may be useful...

How to link using GCC without -l nor hardcoding path for a library that does not follow the libNAME.so naming convention?

You can use -l:[libraryname].so to list the dynamic libraries you want to link against in your library search path. Specifying the .so ending will probably help with your dynamic library only case. You will probably have to specify the whole name with the 'lib' prefix instead of just the shortened version.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文