链接静态库时避免链接未使用的符号

发布于 2024-10-31 13:07:43 字数 606 浏览 0 评论 0原文

我正在使用 Apple gcc 编译一个我要重新分发的 dylib。由于各种原因,我使用了一些库,为了简单起见,我们使用 libz

由于这个库通常在 Mac 系统上找不到,我希望静态链接< /a> 通过将路径传递到 .a-file 来使用符号到 dylib 中以简化部署。

现在,链接器将 lib 中的所有符号链接到生成的 dylib 中,尽管我只引用了一个子集。在 Linux 上我从未遇到过这个问题,链接器很高兴地丢弃所有未引用的符号并创建一个非常小的可执行文件,所以它应该是可能的。我现在拥有的 dylib 文件比应有的大 10 倍。

我尝试摆弄 -dead_code 链接器标志,但无济于事。也许我只是不明白?

有谁知道这个问题的解决办法吗?

I'm using the apple gcc to compile a dylib that I'm going to redistribute. For various reasons I'm using some libraries, let's say libz to keep it simple.

Since this library is not typically found on a Mac system I wish to static link in used symbols into the dylib by passing the path to the .a-file to simplify deployment.

Now, the linker links in all symbols from the lib into the resulting dylib although I only reference a subset. On linux I've never encountered this problem, the linker happily discards all unreferenced symbols and creates a very slim executable, so it should be possible. The dylib file I have now is ~10 times larger than it should.

I've tried fiddle around with the -dead_code linker flag, but to no avail. Perhaps I just don't understand it?

Does anyone know the solution to this?

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

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

发布评论

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

评论(1

瞳孔里扚悲伤 2024-11-07 13:07:43

尝试 -Wl,- -gc-sections

关于-dead_strip-dead_code 可能是您的意思):

打开 -dead_strip 之前
您的项目首先必须选择
被“移植”以处理死代码
剥离。这将包括改变
从 -gused (-g 的默认值)到
-gfull 并重新编译链接到您的所有对象文件
使用新编译器进行编程
Mac OS X 2004 年 6 月发布。还如果
您构建了一个加载的可执行文件
插件,它使用来自
可执行文件,你必须确保
插件使用的符号不是
剥离(通过使用
属性((使用))或 -exported_symbols_list 选项)。如果您正在使用导出列表并构建
共享库或可执行文件
将与 ld(1) 一起使用
-bundle_loader 标志,您需要包含异常符号
导出列表中的帧信息
用于导出的 C++ 符号。这些
符号以.eh结尾,可以看到
使用 nm(1) 工具。

启用死代码剥离
命令行,传递 -dead_strip
ld 的选项。您还应该通过
GCC 的 -gfull 选项可生成完整的调试符号集
你的代码。链接器使用这个额外的
调试信息到dead strip
可执行文件。

希望这有帮助。

此答案中的所有内容均位于“apple ld static link Unused Symbols”的前几个 Google 搜索结果中。 :)

Try -Wl,--gc-sections.

As regards -dead_strip (what you probably meant by -dead_code):

Before turning on the -dead_strip
option your project will first have to
be "ported" to work with dead code
stripping. This will include changing
from -gused (the default for -g) to
-gfull and re-compiling all of the objects files being linked into your
program with the new compiler from the
Mac OS X June 2004 release. Also if
your building an executable that loads
plugins, which uses symbols from the
executable, you will have to make sure
the symbols the plugins use are not
stripped (by using
attribute((used)) or the -exported_symbols_list option). If you are using an export list and building
a shared library, or an executable
that will be used with ld(1)'s
-bundle_loader flag, you need to include the symbols for exception
frame information in the export list
for your exported C++ symbols. These
symbols end with .eh and can be seen
with the nm(1) tool.

and:

To enable dead-code stripping from the
command line, pass the -dead_strip
option to ld. You should also pass the
-gfull option to GCC to generate a complete set of debugging symbols for
your code. The linker uses this extra
debugging information to dead strip
the executable.

Hope this helps.

All content in this answer was located within the first few Google search results for "apple ld static link unused symbols". :)

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