有没有办法让 gcc 输出原始二进制文件?

2024-10-30 08:36:00
admin
原创
42
摘要:问题描述:是否有一组命令行选项可以说服 gcc 从自包含源文件生成平面二进制文件?例如,假设 foo.c 的内容是static int f(int x) { int y = x*x; return y+2; } 没有外部引用,无需导出到链接器。我想获取一个只有该函数的机器指令的小文件,不带任何其他修饰...

问题描述:

是否有一组命令行选项可以说服 gcc 从自包含源文件生成平面二进制文件?例如,假设 foo.c 的内容是

static int f(int x)
{
  int y = x*x;
  return y+2;
}

没有外部引用,无需导出到链接器。我想获取一个只有该函数的机器指令的小文件,不带任何其他修饰。有点像 (DOS) .COM 文件,只是 32 位保护模式。


解决方案 1:

尝试一下:

$ gcc -c test.c     
$ objcopy -O binary -j .text test.o binfile

您可以使用以下命令确保其正确objdump

$ objdump -d test.o 
test.o:     file format pe-i386


Disassembly of section .text:

00000000 <_f>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 04                sub    $0x4,%esp
   6:   8b 45 08                mov    0x8(%ebp),%eax
   9:   0f af 45 08             imul   0x8(%ebp),%eax
   d:   89 45 fc                mov    %eax,-0x4(%ebp)
  10:   8b 45 fc                mov    -0x4(%ebp),%eax
  13:   83 c0 02                add    $0x2,%eax
  16:   c9                      leave  
  17:   c3                      ret  

并将其与二进制文件进行比较:

$ hexdump -C binfile 
00000000  55 89 e5 83 ec 04 8b 45  08 0f af 45 08 89 45 fc  |U......E...E..E.|
00000010  8b 45 fc 83 c0 02 c9 c3                           |.E......|
00000018

解决方案 2:

您可以使用以下方式直接将选项传递给链接器-Wl,<linker option>

相关文件摘自man gcc

-Wl,option

将 option 作为选项传递给链接器。如果 option 包含逗号,则会在逗号处将其拆分为多个选项。您可以使用此语法将参数传递给选项。例如,-Wl,-Map,output.map 将 -Map output.map 传递给链接器。使用 GNU 链接器时,您也可以使用 -Wl,-Map=output.map 获得相同的效果。

因此,当使用 gcc 进行编译时,如果通过,-Wl,--oformat=binary您将生成一个二进制文件,而不是 elf 格式。哪里--oformat=binary告诉ld生成一个二进制文件。

这样就无需objcopy单独进行。

请注意,可以在链接器脚本--oformat=binary中表示为。如果您想处理平面二进制文件,则很有可能从链接器脚本提供的高级别控制中受益。OUTPUT_FORMAT("binary")

解决方案 3:

您可以使用objcopy将文本段从.o 文件或 a.out 文件中提取出来。

$ cat q.c
f() {}
$ cc -S -O q.c
$ cat q.s
        .file   "q.c"
        .text
.globl f
        .type   f, @function
f:
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        ret
        .size   f, .-f
        .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
        .section        .note.GNU-stack,"",@progbits
$ cc -c -O q.c
$ objcopy -O binary q.o q.bin
$ od -X q.bin
0000000 5de58955 000000c3
0000005
$ objdump -d q.o
q.o:     file format elf32-i386
Disassembly of section .text:
00000000 <f>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   5d                      pop    %ebp
   4:   c3                      ret    

解决方案 4:

其他答案肯定是正确的。但是,我必须为 objcopy 指定其他命令行参数,以使我的输出符合预期。请注意,我在 64 位机器上开发 32 位代码,因此有这个-m32参数。此外,我更喜欢英特尔汇编语法,因此您也会在参数中看到这一点。

$ cat test.c
int main() { return 0; }
$ gcc -nostdinc -m32 -masm=intel -Wall -c test.c -o test.o
$ objdump --disassemble --disassembler-options intel test.o

test.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   b8 00 00 00 00          mov    eax,0x0
   8:   5d                      pop    ebp
   9:   c3                      ret    

好的,这里我必须指定我特别只想要 .text 部分:

$ objcopy --only-section=.text --output-target binary test.o test.bin
$ hexdump -C test.bin
00000000  55 89 e5 b8 00 00 00 00  5d c3   |U.......].|
0000000a

我花了大约 2 个小时阅读并尝试不同的选项才弄清楚。希望这能节省其他人的时间。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用