以下文件>
使用
gcc
进行编译,然后使用objdump -d
进行反汇编,最终产生172行输出。我不明白为什么会有这么多输出。不同部分的含义是什么:
int main(void) {
return 0;
}
我当然有一直在阅读有关调用约定和操作码的信息,因此我可以看到该部分与C代码的对应关系。
#1 楼
我看到您将各部分与函数混在一起。问题中提供的是执行ELF二进制文件所必需的函数。例如,
_start
函数通常是二进制文件的入口点,它可能会在某个点调用main
函数。您可以使用readelf -h
在所拥有的二进制文件上获取二进制文件的入口地址。关于输出,尽管您的程序是“空的”,但它仍然可以成功编译和链接-为此不是错误的-放入可执行的ELF中。本文档提供了有关ELF二进制文件的结构及其操作方式的所有信息:ELF格式(PDF)。现在,如果要在二进制文件中检索节信息,请使用
readelf
函数可以再次为您提供帮助,您只需使用-S
和目标二进制文件(readelf -S prog
)进行调用。 readelf
,...)及其相关文档,并开始使用简单的程序,然后再移至破解程序和更高级或模糊的二进制文件。#2 楼
这些不是节,是二进制文件中的不同功能。这些在过程的生命周期中会被多次调用。您感兴趣的是函数
main
。 objdump -d
反汇编了整个二进制文件,但是,如果您仅想了解main
中发生的事情,那么此时,您不必查看其余部分。 使用
gcc
将二进制文件编译为可执行文件时,将调用链接器。如果您不希望调用链接器,请使用
gcc -c
生成目标文件。这是objdump -d test.o
的结果:$ objdump -d test.o
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: b8 00 00 00 00 mov q4312078qx0,%eax
9: 5d pop %rbp
a: c3 retq
这里,由于未链接代码,因此只能看到函数。