gpt4 book ai didi

xcode - 符号隐藏在使用 Xcode 构建的静态库中

转载 作者:行者123 更新时间:2023-12-02 17:36:47 25 4
gpt4 key购买 nike

我试图弄清楚是否可以构建一个静态库来隐藏其所有内部对象和函数等,除了我想要导出的接口(interface)之外。我正在尝试使用 Xcode (gcc 4.2)。

我已经按照 this documentation 在一些 C++ 类上使用了 __attribute__((visibility("hidden"))) 属性。我还将一些辅助 C 函数定义为文件本地(静态)等。

但是,当我在生成的 .a 库文件上运行 strings 时,即使在发布配置中进行编译,我仍然会看到表面上隐藏的类的名称及其方法名称,甚至文件本地函数的名称也散布在那里。

我已将 -fvisibility=hidden 甚至 -fno-rtti 添加到 gcc 标志中。虽然这减少了一些字符串,但类名称、方法名称和静态函数名称仍然以普通或损坏但可读的形式存在。

是否有一种可靠的方法可以让编译器构建这些内容,而无需将所有内部内容的字符串名称发送到二进制文件中?任何外部客户端都不需要链接。

(澄清一下:我问的是内部命名的混淆,而不是文字导出绑定(bind)需求。我感到不安的是,所有内部工作都可以通过 strings 命令可见,无论这些是否符号是否正式导出。)

谢谢。

最佳答案

隐藏内部名称需要一些简单的 Xcode build设置,并且通常不需要修改源代码或更改构建产品的类型。

  1. 通过执行单对象预链接消除模块之间所需的任何内部符号。将名为“执行单对象预链接”的 Xcode build设置设置为"is"(GENERATE_MASTER_OBJECT_FILE=YES)。这会导致 ld 使用“-r”标志运行。
  2. 确保“ strip 样式”设置为“非全局符号”(STRIP_STYLE=非全局),这会将“-x”传递给 ld。
  3. 如果启用了后处理(这不是默认设置),则仅在静态库上实际执行剥离。将 Xcode build设置“部署后处理”设置为 yes。 (部署后处理=是)。另请确保“使用单独 strip ”设置为"is"(并不总是默认值)(SEPARATE_STRIP=YES)。
  4. 如果除了本地符号之外,如果您需要删除一些全局符号,您可以在 Xcode build设置“附加 strip 标志”下为 ​​strip 命令提供其他选项。例如。我通常使用“-R somefile”选项来提供带有附加符号列表的文件,我希望将其从全局符号表中删除。

关于xcode - 符号隐藏在使用 Xcode 构建的静态库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3276474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com