GCC 生成无格式二进制文件 GCC(GNU Compiler Collection)是一款功能强大的编译器,能够生成各种类型的二进制文件。在本文中,我们将探讨如何使用 GCC 生成无格式二进制文件,并分析生成的二进制文件的结构。 一、生成无格式二进制文件 要生成无格式二进制文件,我们可以使用以下命令: gcc -c test.c -ld -o test -Ttext 0x0 -e main test.o objcopy -R .note -R .comment -S -O binary test test.bin 其中,test.c 是我们的源代码文件,test.o 是生成的目标文件,test.bin 是生成的无格式二进制文件。 二、分析生成的二进制文件 使用 objdump 工具,我们可以分析生成的二进制文件: objdump -D -b binary -a i386 test.bin 结果如下: 00000000 <main>: 0: 55 push %ebp 1: 89 e5 mov %esp, %ebp 3: 83 ec 08 sub $0x8, %esp 6: 83 e4 f0 and $0xfffffff0, %esp 9: b8 00 00 00 00 mov $0x0, %eax e: 29 c4 sub %eax, %esp 10: c9 leave 11: c3 ret 从结果中我们可以看到,生成的二进制文件中包含了我们编写的 main 函数的机器码。 三、局部变量的处理 接下来,我们将探讨 GCC 是如何处理局部变量的。我们编写一个新的 test.c 文件: int main(){ int i; i = 0x12345678; } 使用同样的命令编译生成 test.bin 文件,然后使用 objdump 进行反汇编: 00000000 <main>: 0: 55 push %ebp 1: 89 e5 mov %esp, %ebp 3: 83 ec 08 sub $0x8, %esp 6: 83 e4 f0 and $0xfffffff0, %esp 9: b8 00 00 00 00 mov $0x0, %eax e: 29 c4 sub %eax, %esp 10: c7 45 fc 78 56 34 12 movl $0x12345678, 0xfffffffc(%ebp) 17: c9 leave 18: c3 ret 从结果中我们可以看到,GCC 将局部变量 i 的空间分配在堆栈中,并将其初始化为 0x12345678。 四、全局变量的处理 我们将探讨 GCC 是如何处理全局变量的。我们编写一个新的 test.c 文件: int i; int main(){ i = 0x12345678; } 使用同样的命令编译生成 test.bin 文件,然后使用 objdump 进行反汇编: 00000000 <main>: 0: 55 push %ebp 1: 89 e5 mov %esp, %ebp 3: 83 ec 08 sub $0x8, %esp 6: 83 e4 f0 and $0xfffffff0, %esp 9: b8 00 00 00 00 mov $0x0, %eax e: 29 c4 sub %eax, %esp 10: c7 05 1c 10 00 00 78 movl $0x12345678, 0x101c 17: 56 34 12 1a: c9 leave 1b: c3 ret 从结果中我们可以看到,GCC 将全局变量 i 放到了 0x101c 处,这是 GCC 默认以 page-align 对齐数据段的结果。
剩余29页未读,继续阅读
- 粉丝: 42
- 资源: 63
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助