1

生成没有设置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 标记为“不可死剥离”并让最终的应用程序链接尊重这一点,这似乎是一个更好的前进方式。

4

1 回答 1

1

我解决了。

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

echo > empty.s
$(CC) $(CFLAGS) input.o empty.s -nostdlib -Wl,r -o output.o
于 2012-10-22T12:18:06.207 回答