【问题标题】:How to make an object file that cannot be dead_stripped?如何制作不能被 dead_stripped 的目标文件?
【发布时间】:2012-10-19 17:37:50
【问题描述】:

生成一个设置SUBSECTIONS_VIA_SYMBOLS标志的Mach-O目标文件的最简单方法是什么,这样链接器(带有-dead_strip)就不会稍后尝试剪切将文本部分分成几部分,猜猜使用了哪些部分?

我可以使用 llvm/gcc (4.2.1) 的命令行选项来阻止它首先发出.subsections_via_symbols,或者使用命令行工具从现有对象中删除标志文件。

(根据 Mach-O 规范自己编写这样的工具是一种选择,但如果可能的话,我宁愿不要那么辛苦地重新发明轮子)。

平台: iOS,从 OSX 与 XCode 4.5 交叉编译。


背景:我们正在提供其他公司构建到应用程序中的静态库。当我们的库遇到问题时,它会生成一个崩溃报告,其中包含堆栈跟踪和某些其他关键信息(如果我们幸运的话)我们可以稍后进行分析。通常,部署的应用程序已被剥离调试信息,因此解释堆栈跟踪是一个问题。如果我们自己制作应用程序,我们只需在剥离之前保存 DWARF 调试数据,并使用它来解码传入崩溃报告中的地址。但我们不能依赖应用程序制造商通过链接步骤向我们提供此类数据。

我们正在做的是让崩溃报告包含所选函数的运行时地址;从中我们可以推断出 我们的 链接器映射中的地址与崩溃报告中的地址之间的偏移量。我们将整个库逐步链接到单个 .o 中,然后再将其填充到 .a 中;因为它只做一件大事,所以当应用程序最终链接时,从其中删除未使用的功能不会节省太多。不幸的是,库中有一些 段代码有时没有使用(主要功能的替代 API 入口点、用于解释我们的错误代码的小帮助函数等),如果应用程序开发者使用-dead_strip链接,它会干扰崩溃报告的地址重建,即最终应用程序中的相对偏移量与我们增量链接操作的链接器映射不同。

我们不能现实地要求所有应用开发者在他们的构建过程中禁用死代码剥离,所以如果我们可以将我们的 .o 标记为“不可死剥离”并让最终的应用链接,这似乎是一个更好的方法尊重这一点。

【问题讨论】:

    标签: ios linker mach-o dead-code


    【解决方案1】:

    我解决了。

    如果所有输入对象都设置了 MH_SUBSECTIONS_VIA_SYMBOLS,则增量链接操作的输出仅设置了 MH_SUBSECTIONS_VIA_SYMBOLS。并且从汇编程序输入生成的目标文件只有在有明确的指令集时才设置它。因此,可以通过与 empty 汇编器输入链接来删除标志:

    echo > empty.s
    $(CC) $(CFLAGS) input.o empty.s -nostdlib -Wl,r -o output.o
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多