我觉得程序员这个群体是非常幸运的一群人,我们生在一个技术改变世界的时代,而我们可能正做着能够改变世界的技术,这是何等的荣耀和机遇。 ——《MacTalk 人生元编程》 前言 大概每个程序员在开篇都会写一个 Hello World! 来作为开始。这是我的第一篇博客,就来写一写程序员眼中的 Hello World!。 这是一个 01 的世界 每个伟大的梦想都来自最小的尝试。秒写一个代码:hello.c #include <stdio.h> int main() { printf("Hello world\n"); return 0; } 这段代码相信大家都很熟悉,无非就是输出一个 Hello world 字符串。下面我们就来分析一下这段代码。 预处理阶段 我们可以使用 gcc -E hello.c -o hello.i 来将预处理之后的数据存到 hello.i 中,或者使用 > 重定向到指定的文件,预处理的结果比较简单,大家可以直接看输出的结果。 编译阶段 gcc -S hello.i -o hello.s 将预处理之后的文件编译成 hello.s 文件。 在编译阶段,编译器检查代码的规范性、是否有语法错误等,在检查无误后,gcc 把代码翻译成汇编语言。 我们来看一下编译之后的文件 >more hello.s .file "hello.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: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits 汇编阶段 汇编阶段将编译阶段生成的.s 文件转成二进制目标代码。 gcc -c hello.s -o hello.o 生成了.o 二进制文件,这时就不能使用 more 来进行文本查看了,可以使用 objdump 命令。 objdump -d hello.o ...