问题如标题中所述:是否可以将ELF二进制文件hello_world
转换为目标文件hello_world.o
,该文件可用于生成新的二进制文件hello_world_2
(是的副本)hello_world
?
因此,从我的搜索来看,这似乎有些困难。我发现一种最接近的方法是:
使用objcopy
或ld
从二进制文件创建目标文件。一个示例命令是:
ld -r -b binary ./hello_world -o hello_world.o
此命令创建一个由类似以下内容的部分组成的目标文件
00000000 l d .data 00000000 .data
00000000 g .data 00000000 _binary_hello_world_start
00000010 g .data 00000000 _binary_hello_world_end
00000010 g *ABS* 00000000 _binary_hello_world_size
如果将此新生成的目标文件与单独的C文件链接(https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/),则可以访问该文件。但是,这与我希望执行的操作有些不同,因为我需要创建一个单独的代码来访问这个新的目标文件。
这:使用GNU objcopy从Elf生成可执行二进制文件StackOverflow讨论提供了一个类似主题的很好的解释。但是,我仍然想知道是否有某种方法可以解决我的原始问题:
binary
-> binary.o
->binary_new
旁注:如果有人好奇为什么我要这样做,是因为我想将.rodata节添加到我没有源代码的二进制文件中(这是另一个问题,下面将对此进行广泛讨论)。建议将此过程与目标文件一起使用,因为在加载时将可读到二进制文件中新添加的部分。
谢谢你的任何建议,
看来这有点困难
这有点轻描淡写:出于所有实际目的,这是不可能做到的(至少在ELF平台上),因为在链接过程中,链接hello_world
器会丢弃包含在的对象文件中的许多信息,这些信息对于构成hello_world
,是必需的。再来一次。
我正在尝试将.rodata节添加到我没有源代码的二进制文件中
这是不太可能是你的真正目标-原始二进制不会将你的加入.rodata
,让你的目标必须是什么别的。另请参见http://xyproblem.info/。
您好,感谢您的回覆。我在所有声明中都同意您的看法,而且我认为这是绝对不可能做到的。只是为了回答您的第二点,最终目标是能够读取带有修补的二进制文件的原始二进制文件的.rodata部分(使用二进制工具,例如Intel PIN)。我已经为拥有
.o
文件的二进制文件实现了此功能,因此我想知道是否可以在没有源代码的情况下对二进制文件进行处理。真挚地。