避免从 Linux 上的可执行文件中导出符号

Posted

技术标签:

【中文标题】避免从 Linux 上的可执行文件中导出符号【英文标题】:Avoiding exporting symbols from executables on Linux 【发布时间】:2011-01-23 10:19:34 【问题描述】:

我发现当我将可执行文件链接到静态库 (.a) 时,静态库中的符号最终会被可执行文件导出。我想避免这种情况并且不导出任何内容。

我尝试过提供版本脚本,但似乎没有什么区别。我的版本脚本内容如下:


    global:
        main;
    local:
        *;
;

在静态库中链接时,有没有办法不从可执行文件中导出符号?我无法重新编译静态库本身。

【问题讨论】:

【参考方案1】:

默认情况下,可执行文件不会导出符号,除非您使用 -Wl,--export-dynamic,否则不会这样做。仅当您动态加载本身需要链接到主可执行文件中的符号的库时才需要这样做(如果您的库包含覆盖 exe 中的虚拟方法的类,这在 C++ 中很常见)

也许您将导出符号与调试符号混淆了。为了调试器的利益,将生成调试符号(如果您不剥离 exe),但不需要运行。

【讨论】:

似乎 gcc 4.8.2(在 arch linux 上)默认导出 exec 函数名称,如果使用 -fvisibility=hidden 则事件。并且只有在链接器中添加 -s 才能删除符号。【参考方案2】:

使用strip ?

$ man strip

【讨论】:

Strip 不会停止可执行文件导出符号,如果确实如此,因为它只会关闭调试信息。 @MarkR:阅读 strip 的手册页 - 它可以删除的不仅仅是调试符号 但是如果你删除了需要运行的部分,那么二进制文件显然不会再运行了:) 这行得通,而且似乎与将 -s 传递给链接器非常相似。

以上是关于避免从 Linux 上的可执行文件中导出符号的主要内容,如果未能解决你的问题,请参考以下文章

linux内核模块中fd inode的可执行路径

使用 def 文件从可执行文件中导出函数

从 Cocoa 应用程序项目中导出 XCode 中的 OSX 可执行文件

为啥我可以链接两个库在 VC 中导出相同的 C-Function?

linux当前目录下的可执行文件不能直接执行的原因

由于调试符号,巨大的可执行文件,为啥?