gpt4 book ai didi

ios - 如何制作一个不能dead_stripped的目标文件?

转载 作者:行者123 更新时间:2023-11-29 13:26:36 25 4
gpt4 key购买 nike

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

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

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

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


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

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

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

最佳答案

我解决了。

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

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

关于ios - 如何制作一个不能dead_stripped的目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979516/

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