【发布时间】:2011-03-17 15:07:05
【问题描述】:
我试图弄清楚我是否可以构建一个静态库来隐藏它的所有内部对象和函数等,除了我想要导出的接口。我正在试验 Xcode (gcc 4.2)。
根据this documentation,我在一些C++ 类上使用了__attribute__((visibility("hidden"))) 属性。我还将小辅助 C 函数定义为文件本地(静态)等。
但是,当我在生成的 .a 库文件上运行 strings 时,即使在发布配置中编译时,我仍然会看到我表面上隐藏的类的名称,以及它们的方法名称,甚至是文件的名称——当地的功能也散落在那里。
我已将 -fvisibility=hidden 甚至 -fno-rtti 添加到 gcc 标志中。虽然这减少了一些字符串,但类名、方法名和静态函数名仍然以普通或损坏但可读的形式存在。
有没有一种可靠的方法可以让编译器在不将所有内部内容的字符串名称发送到二进制文件中的情况下构建这些内容?任何外部客户端都不需要链接。
(澄清一下:我问的是内部命名的混淆,而不是文字导出绑定需求。我很不安所有内部工作都可以通过strings 命令看到,无论这些符号是正式导出还是不是。)
谢谢。
【问题讨论】:
-
如果启用 RTTI,无论如何都会嵌入所有类名,以使
type_info::name()工作。您可以尝试使用-fno-rtti重新编译,看看是否有所不同。当然,如果您在任何地方使用dynamic_cast,这将不起作用。 -
感谢您的提示。试过了,但所有的名字仍然以错误的形式存在。
-
你真的应该考虑重新授予答案,因为这个答案不需要任何技巧。它不仅删除了我的大部分名字,而且大大减少了我需要共享的库的大小。
-
@DavidH:完成,感谢您的提醒。有一段时间没有重新审视这个问题了。
标签: xcode gcc obfuscation symbols