Warm tip: This article is reproduced from serverfault.com, please click

c-将ELF二进制文件转换为.o文件

(c - Converting an ELF binary into an .o file)

发布于 2020-12-06 03:23:18

问题如标题中所述:是否可以将ELF二进制文件hello_world转换为目标文件hello_world.o,该文件可用于生成新的二进制文件hello_world_2(是的副本)hello_world

因此,从我的搜索来看,这似乎有些困难。我发现一种最接近的方法是:

使用objcopyld从二进制文件创建目标文件。一个示例命令是:

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节添加到我没有源代码的二进制文件中(这是另一个问题,下面将对此进行广泛讨论)。建议将此过程与目标文件一起使用,因为在加载时将可读到二进制文件中新添加的部分。

  1. 如何使用OBJCOPY的--add-section开关?

  2. 如何使用objcopy或libelf将elf文件的一部分替换为另一部分,以使其确实加载到内存中?

  3. 在汇编代码中定义新代码段以编译ELF二进制文件

谢谢你的任何建议,

Questioner
Jay
Viewed
11
Employed Russian 2020-12-06 13:11:55

看来这有点困难

这有点轻描淡写:出于所有实际目的,这是不可能做到的(至少在ELF平台上),因为在链接过程中,链接hello_world会丢弃包含在的对象文件中的许多信息,这些信息对于构成hello_world,是必需的。再来一次。

我正在尝试将.rodata节添加到我没有源代码的二进制文件中

这是不太可能是你的真正目标-原始二进制不会将你的加入.rodata,让你的目标必须是什么别的另请参见http://xyproblem.info/