Mach-O可执行文件的__LINKEDIT段可以移动

问题描述 投票:2回答:2

[在Mach-O可执行文件中,我正在尝试使用自制的工具来增大__LLVM片段之前的__LINKEDIT片段的大小。我正在考虑两种策略:(a)将__LLVM段移动到__LINKEDIT段之后,生成一个不是ld会创建的文件(现在的间隙和段地址乱序),以及(b)移动__LINKEDIT段,以调整其前面的__LLVM段的大小。我需要将结果接受下游处理,例如生成.ipa文件或发送到App Store。

这个问题是关于我的假设以及这些方法的可行性。具体来说,每种可能导致失败的潜在陷阱是什么?

我实现了第一种方法(a),这是segedit的-extract选项所理解的,但是它的-replace选项却抱怨这些段是乱序的。我将新段添加到文件中,并在相应的load命令中更新地址和长度值,以引用此新段数据(在文件和目标内存中)。只要其他下游处理将接受该结果,这可能很好(仍在检查;例如,任何本地签名都可能无效)。

第二种方法(b)看起来更干净,只要没有__LINKEDIT段的引用into,我猜它包含链接信息(符号表等,而不是代码)。我还没有尝试过,尽管似乎已经断定segedit将对结果感到满意,这可能表明其他处理也可能会更快乐。仅仅由于移动此段,可能存在任何无效的引用吗?我猜想我将不得不更新更多的加载命令(它们似乎引用到__LINKEDIT段中),我没有检查过,但这应该很简单。

编辑:用“段”(答案中提到的)代替了我对“节”的混淆使用。

添加:上下文是我无法控制生成原始可执行文件的位置。我需要对其进行后处理,本质上执行一个“ segedit -replace”过程,其中该段中的a部分将被大于以前为该段分配的空间的部分所替代。

RUN-ON澄清的问题:从答案看来,移动__LINKEDIT段将破坏它。只能通过调整加载命令(例如LC_DYLD_INFO_ONLY,LC_LOAD_DYLINKER,LC_LOAD_DYLIB)来解决此问题,而不能调整任何段中的数据吗?我还不熟悉这些装入命令,并且想知道是否要执行此操作。

在Mach-O可执行文件中,我正在尝试使用自产工具增加__LINKEDIT段之前的__LLVM段的大小。我正在考虑两种策略:(a)移动__LLVM ...

mach-o
2个回答
1
投票

因此,基本上,这些段和节描述了物理文件如何映射到虚拟内存。正如我在答案的上一迭代中提到的那样,细分顺序存在局限性:


1
投票

我知道这是一个老问题,但是我在解决另一个problem时解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.