Objcopy - 可写文本不能使elf二进制文本部分可写吗?

时间:2014-02-07 22:22:15

标签: c linux elf binutils objcopy

我试图使用.text使elf二进制文件的objcopy --writable-text executable_name部分可写。该命令正常执行,没有任何错误。

通过readelf检查部分权限时,我可以看到文本部分仍然只具有读取和执行权限。

在浏览此特定选项的objcopy手册页时,提到该选项对所有二进制格式都没有意义。 (这是我无法做到的原因吗?)。

任何人都可以指出我在这里缺少的东西。

由于

(Ubuntu x86_64 bit machine,GNU objcopy(GNU Binutils for Ubuntu)2.22.90.20120924)

3 个答案:

答案 0 :(得分:1)

  

在查看此特定选项的objcopy手册页时,提到该选项对所有二进制格式都没有意义。 (这是我无法做到的原因吗?)。

在此rather detailed description of special sections the ELF format,您会看到.text具有SHF_ALLOC + SHF_EXECINSTR属性(为其分配了空间,空间中包含可执行代码),但不是SHF_WRITE (可以写入空格)。您要求objcopy做的只是对ELF .text部分无效。

答案 1 :(得分:1)

在Debian上,我只能链接到-N,并生成一个带有可写.text

的可执行文件

所以:ld -N obj.o

答案 2 :(得分:0)

首先完成此操作: objcopy --writable-text --set-section-flags .text = CONTENTS,ALLOC,LOAD,CODE

然后objdump -x或readelf -a查看通常在程序头之后的加载段表。请参阅ELF的手册页。对于32位可执行文件,例如:

使用hexedit打开二进制文件并查看文件偏移量0x1C(通常为0x34)处的值,然后遍历0x20字节结构(文件偏移量0x2a处列出的大小),直到找到您在上一个转储中标识的结构包含.text部分。倒数第二个长值将是00000005(05 00 00 00)并且需要添加写入,这将成为00000007(07 00 00 00)。现在它将按预期工作,没有任何限制,例如-Wl, - omagic的共享库问题。有点技术性,但需要几秒钟才能完成。

无论如何,这一位标志已经引起了无数问题,没有任何解释澄清了这一小点,使其能够完美地运作。

可以使用GCC轻松编译代码解决方案以进行更改,如果按常规方式执行此操作可能更容易,也是更好的解决方案:

cell.panCellToDeleteBlock = { [weak self] indexPath in
    self?.dataArray.remove(at: indexPath.row)
    self?.collectionView.reloadData()
}