【发布时间】:2013-03-19 14:36:14
【问题描述】:
我一直在玩 GCC 的程序集输出开关:
gcc -S -c helloworld.c
helloworld.c:
#include <stdio.h>
int main(void){
printf("Hello World!\n");
return 0;
}
helloworld.s:
.file "helloworld.c"
.section .rodata
.LC0:
.string "Hello World!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits
在输出helloworld.s 文件中,我注意到汇编命令输出“Hello World!”文字很简单:
call puts
但是,helloworld.s1 文件中没有 puts 过程汇编代码。我在哪里可以查看此汇编代码?
【问题讨论】:
-
这是因为您的 C 程序期望与标准 C 运行时库链接,其中包含
puts()。当然,如果您愿意,您可以在反汇编时挖掘系统上的库文件。 -
这是
libc.so文件吗? -
是的,就是
libc.so;我建议用gcc -O -S -fverbose-asm编译 -
我无法让 objdump 反汇编
libc.so,但我确实在部分下的 libc.a中找到了代码:objdump -d /usr/lib/x86_64-linux-gnu/libc.a -
Debian 使用的是开源的 eglibc,所以你可以看到它的实际 C 源代码。
标签: c linux gcc assembly disassembly