我有一个非常简单的测试二进制文件,我正在用objdump查看。我看到一个令我困惑的汇编指令。代码如下所示:
int main(int argc, char* argv[]){
return 42;
}
当我做objdump -d test
时,我看到了一个有趣的功能:
00000000004004a0 <__do_global_dtors_aux>:
4004a0: 80 3d 85 0b 20 00 00 cmpb $0x0,0x200b85(%rip) # 60102c <_edata>
4004a7: 75 11 jne 4004ba <__do_global_dtors_aux+0x1a>
4004a9: 55 push %rbp
4004aa: 48 89 e5 mov %rsp,%rbp
4004ad: e8 7e ff ff ff callq 400430 <deregister_tm_clones>
4004b2: 5d pop %rbp
4004b3: c6 05 72 0b 20 00 01 movb $0x1,0x200b72(%rip) # 60102c <_edata>
4004ba: f3 c3 repz retq
4004bc: 0f 1f 40 00 nopl 0x0(%rax)
从那里开始第二个,指令是f3 c3
或repz retq
。现在在x86指令集引用中查找f3
,我发现这是一个遗留前缀。
所以c3 / ret
肯定不是列在它之前的列出的有效指令之一,所以我想知道为什么我的二进制文件正在这样做。
我正在执行这样的gcc(4.8.5):
gcc -g -Wall -c src/test.c -o obj/test.o
gcc -g -Wall obj/test.o -o bin/test