C语言的编译链接流程
1. 编译链接流程图
2. 引言
#include <stdio.h>
#define OUTPUT_STR "hello world"
int main()
{
printf("%s\n", OUTPUT_STR);
return 0;
}
对于上面这个代码,大家可能再熟悉不过了,现在我们来从头分析它,如何从源码变为可执行程序
3. 预编译
预编译的命令:
gcc -E *.c -o *.i
其中 *.c 表示C语言编写的源代码,*i 表示输出的 .i 预处理文件,-o表示输出
完整解释:用 -E 这个指令,将 .c 文件,通过预编译输出 .i 文件
现在我们通过GCC对上面的C语言源代码生成对应的.i预处理文件,观察生成的文件内容
gcc -E hello.c -o hello.i
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 868 "/usr/include/stdio.h" 3 4
# 2 "hello.c" 2
# 5 "hello.c"
int main()
{
printf("%s\n", "hello world");
return 0;
}
会看到很多其他的内容,到了主函数部分呈现上图内容
现象总结:
源代码通过预处理器变为预处理文件,预处理器会对以#开头的预处理命令进行处理
hello.c 中的#include <stdio.h>,预处理器会将系统中的hello.h的具体内容读取到文本内容中,替换掉原有的#include <stdio.h>
另外,很多宏替换,也是在此阶段进行的,比如把 #define OUTPUT_STR “hello world”,直接替换掉了
4. 编译
编译的命令:
gcc -S *.i -o *.s
其中 *.i 表示经预处理后生成的.i预处理文件,*s 表示输出的 .s 汇编文件,-o表示输出
完整解释:用 -S 这个指令,将 .i 文件,通过编译输出 .s 汇编文件
现在我们通过GCC对预处理.i文件生成对应的.s汇编文件,观察生成的文件内容
gcc -S hello.i -o hello.s
.file "hello.c"
.text
.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
leaq .LC0(%rip), %rdi
call puts@PLT
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
会看到很多其他的内容,到了主函数部分呈现上图内容
现象总结:
预处理文件通过编译器变为汇编文件
5. 汇编
编译的命令:
gcc -c *s.-o *.o
其中 *.s表示经编译后生成的.s汇编文件,*o 表示输出的 .o 目标文件,-o表示输出
完整解释:用 -c 这个指令,将 .s 文件,通过汇编输出 .o 目标件
现在我们通过GCC对汇编.s文件生成对应的.o目标文件,观察生成的文件内容
gcc -c hello.s -o hello.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^B^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^M^@^L^@UH<89>åH<8d>=^@^@^@^@è^@^@^@^@¸^@^@^@^@]Ãhello world^@^@GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^@^@^\^@^@^@^\^@^@^@^@^@^@^@^W^@^@^@^@A^N^P<86>^BC^M^FR^L^G^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^D^@ñÿ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^R^@^A^@^@^@^@^@^@^@^@^@^W^@^@^@^@^@^@^@^N^@^@^@^P^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$^@^@^@^P^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@hello.c^@main^@_GLOBAL_OFFSET_TABLE_^@puts^@^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@^B^@^@^@^E^@^@^@üÿÿÿÿÿÿÿ^L^@^@^@^@^@^@^@^D^@^@^@^K^@^@^@üÿÿÿÿÿÿÿ ^@^@^@^@^@^@^@^B^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@.symtab^@.strtab^@.shstrtab^@.rela.text^@.data^@.bss^@.rodata^@.comment^@.note.GNU-stack^@.rela.eh_frame^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^A^@^@^@^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@^@^@^W^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^[^@^@^@^D^@^@^@@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^X^B^@^@^@^@^@^@0^@^@^@^@^@^@^@
^@^@^@^A^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@&^@^@^@^A^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@W^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@,^@^@^@^H^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@W^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@1^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@W^@^@^@^@^@^@^@^L^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@9^@^@^@^A^@^@^@0^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@c^@^@^@^@^@^@^@*^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@B^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<8d>^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@W^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<90>^@^@^@^@^@^@^@8^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@R^@^@^@^D^@^@^@@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@H^B^@^@^@^@^@^@^X^@^@^@^@^@^@^@
^@^@^@^H^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@^A^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^@^@^@^@^@^@^@ ^A^@^@^@^@^@^@^K^@^@^@ ^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@ ^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@è^A^@^@^@^@^@^@)^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^Q^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@`^B^@^@^@^@^@^@a^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
会看到很多无法识别的内容,这些内容为二进制信息
现象总结:
汇编文件经汇编过程生成对应的目标文件,这个文件为二进制文件,并不是给人看的,而是给机器看的
6. 链接
链接的命令:
gcc *o.-o *.out
其中 *.o表示经汇编后生成的.o目标文件,*out 表示输出的可执行文件,-o表示输出
完整解释:用 这个指令,将 .o 文件,通过链接输出 .out 可执行文件
现在我们通过GCC对目标.o文件生成对应的.out可执行文件,观察生成的文件内容
另外,对于我们平常生成可执行文件,都不带.out后缀
gcc hello.o -o hello.out
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^C^@>^@^A^@^@^@0^E^@^@^@^@^@^@@^@^@^@^@^@^@^@0^Y^@^@^@^@^@^@^@^@^@^@@^@8^@ ^@@^@^]^@^\^@^F^@^@^@^D^@^@^@@^@^@^@^@^@^@^@@^@^@^@^@^@^@^@@^@^@^@^@^@^@^@ø^A^@^@^@^@^@^@ø^A^@^@^@^@^@^@^H^@^@^@^@^@^@^@^C^@^@^@^D^@^@^@8^B^@^@^@^@^@^@8^B^@^@^@^@^@^@8^B^@^@^@^@^@^@^\^@^@^@^@^@^@^@^\^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^A^@^@^@^E^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@8^H^@^@^@^@^@^@8^H^@^@^@^@^@^@^@^@ ^@^@^@^@^@^A^@^@^@^F^@^@^@¸^M^@^@^@^@^@^@¸^M ^@^@^@^@^@¸^M ^@^@^@^@^@X^B^@^@^@^@^@^@`^B^@^@^@^@^@^@^@^@ ^@^@^@^@^@^B^@^@^@^F^@^@^@È^M^@^@^@^@^@^@È^M ^@^@^@^@^@È^M ^@^@^@^@^@ð^A^@^@^@^@^@^@ð^A^@^@^@^@^@^@^H^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@T^B^@^@^@^@^@^@T^B^@^@^@^@^@^@T^B^@^@^@^@^@^@D^@^@^@^@^@^@^@D^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@Påtd^D^@^@^@ð^F^@^@^@^@^@^@ð^F^@^@^@^@^@^@ð^F^@^@^@^@^@^@<^@^@^@^@^@^@^@<^@^@^@^@^@^@^@^D^@^@^@^@^@^@^@Qåtd^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^P^@^@^@^@^@^@^@Råtd^D^@^@^@¸^M^@^@^@^@^@^@¸^M ^@^@^@^@^@¸^M ^@^@^@^@^@H^B^@^@^@^@^@^@H^B^@^@^@^@^@^@^A^@^@^@^@^@^@^@/lib64/ld-linux-x86-64.so.2^@^D^@^@^@^P^@^@^@^A^@^@^@GNU^@^@^@^@^@^C^@^@^@^B^@^@^@^@^@^@^@^D^@^@^@^T^@^@^@^C^@^@^@GNU^@<85>¿<88>X<9d> evõþ£<87>^Fà^?Þ<9e>GÝÝ^A^@^@^@^A^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@=^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^K^@^@^@^R^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^_^@^@^@^R^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@Y^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@h^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^P^@^@^@"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@libc.so.6^@puts^@__cxa_finalize^@__libc_start_main^@GLIBC_2.2.5^@_ITM_deregisterTMCloneTable^@__gmon_start__^@_ITM_registerTMCloneTable^@^@^@^@^@^B^@^B^@^@^@^@^@^B^@^A^@^A^@^A^@^@^@^P^@^@^@^@^@^@^@u^Zi ^@^@^B^@1^@^@^@^@^@^@^@¸^M ^@^@^@^@^@^H^@^@^@^@^@^@^@0^F^@^@^@^@^@^@À^M ^@^@^@^@^@^H^@^@^@^@^@^@^@ð^E^@^@^@^@^@^@^H^P ^@^@^@^@^@^H^@^@^@^@^@^@^@^H^P ^@^@^@^@^@Ø^O ^@^@^@^@^@^F^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@à^O ^@^@^@^@^@^F^@^@^@^C^@^@^@^@^@^@^@^@^@^@^@è^O ^@^@^@^@^@^F^@^@^@^D^@^@^@^@^@^@^@^@^@^@^@ð^O ^@^@^@^@^@^F^@^@^@^E^@^@^@^@^@^@^@^@^@^@^@ø^O ^@^@^@^@^@^F^@^@^@^F^@^@^@^@^@^@^@^@^@^@^@Ð^O ^@^@^@^@^@^G^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@H<83>ì^HH<8b>^Eõ
^@H<85>Àt^BÿÐH<83>Ä^HÃ^@ÿ5º
^@ÿ%¼
^@^O^_@^@ÿ%º
^@h^@^@^@^@éàÿÿÿÿ%Ò
^@f<90>^@^@^@^@^@^@^@^@1íI<89>Ñ^H<89>âH<83>äðPTL<8d>^E<8a>^A^@^@H<8d>^M^S^A^@^@H<8d>=æ^@^@^@ÿ^U<86>
^@ô^O^_D^@^@H<8d>=©
^@UH<8d>^E¡
^@H9øH<89>åt^YH<8b>^EZ
^@H<85>Àt^M]ÿàf.^O^_<84>^@^@^@^@^@]Ã^O^_@^@f.^O^_<84>^@^@^@^@^@H<8d>=i
^@H<8d>5b
^@UH)þH<89>åHÁþ^CH<89>ðHÁè?H^AÆHÑþt^XH<8b>^E!
^@H<85>Àt^L]ÿàf^O^_<84>^@^@^@^@^@]Ã^O^_@^@f.^O^_<84>^@^@^@^@^@<80>=^Y
^@^@u/H<83>=÷ ^@^@UH<89>åt^LH<8b>=ú ^@è^MÿÿÿèHÿÿÿÆ^Eñ ^@^A]Ã^O^_<80>^@^@^@^@óÃf^O^_D^@^@UH<89>å]éfÿÿÿUH<89>åH<8d>=<9f>^@^@^@èÆþÿÿ¸^@^@^@^@]Ãf.^O^_<84>^@^@^@^@^@^O^_D^@^@AWAVI<89>×AUATL<8d>%F^G ^@UH<8d>-F^G ^@SA<89>ýI<89>öL)åH<83>ì^HHÁý^CèWþÿÿH<85>ít 1Û^O^_<84>^@^@^@^@^@L<89>úL<89>öD<89>ïAÿ^TÜH<83>Ã^AH9ÝuêH<83>Ä^H[]A\A]A^A_Ã<90>f.^O^_<84>^@^@^@^@^@óÃ^@^@H<83>ì^HH<83>Ä^HÃ^@^@^@^A^@^B^@hello world^@^A^[^C;<^@^@^@^F^@^@^@^Pþÿÿ<88>^@^@^@0þÿÿ°^@^@^@@þÿÿX^@^@^@JÿÿÿÈ^@^@^@pÿÿÿè^@^@^@àÿÿÿ0^A^@^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^G^P^T^@^@^@^\^@^@^@àýÿÿ+^@^@^@^@^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H<90>^A^@^@$^@^@^@^\^@^@^@<80>ýÿÿ ^@^@^@^@^N^PF^N^XJ^O^Kw^H<80>^@?^Z;*3$"^@^@^@^@^T^@^@^@D^@^@^@xýÿÿ^H^@^@^@^@^@^@^@^@^@^@^@^\^@^@^@\^@^@^@zþÿÿ^W^@^@^@^@A^N^P<86>^BC^M^FR^L^G^H^@^@^@D^@^@^@|^@^@^@<80>þÿÿe^@^@^@^@B^N^P<8f>^BB^N^X<8e>^CE^N <8d>^DB^N(<8c>^EH^N0<86>^FH^N8<83>^GM^N@r^N8A^N0A^N(B^N B^N^XB^N^PB^N^H^@^P^@^@^@Ä^@^@^@¨þÿÿ^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@@@@
会看到很多无法识别的内容,这些内容为二进制信息
现象总结:
目标文件经链接过程生成对应的可执行文件,这个文件为二进制文件,并不是给人看的,而是给机器看的
过程总结:
链接过程是从源代码到可执行程序的最后一个过程,在hello.c源代码中调用了printf函数,链接器会将printf.o文件并入hello.out可执行文件中
7. 执行结果
mrs@mrs-virtual-machine:~/Desktop$ ./hello.out
hello world
mrs@mrs-virtual-machine:~/Desktop$
附录
扩展名
扩展名 | 含义 |
---|---|
.c | C语言源代码文件 |
.a | 由目标文件构成的静态库文件 |
.C | C+++源代码文件 |
.h | 程序所包含的头文件 |
.i | 预处理过的C原代码文件 |
.ii | 预处理过的C++源代码文件 |
.o | 编译后的目标文件 |
.m | Objective -C源代码文件 |
.out | 链接器生成的可执行文件 |
.s | 汇编语言源代码文件,后期不再进行预处理操作 |
.S | 汇编语言源代码文件,后期还会进行预处理操作,可以包含预处理指令 |