C语言的编译链接流程

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>^^?Þ<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>^^@H<85>Àt^BÿÐH<83>Ä^^@ÿ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>^^@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ÿÿÿÆ^^@^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>Ä^^@^@^@^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$ 

附录

扩展名

扩展名含义
.cC语言源代码文件
.a由目标文件构成的静态库文件
.CC+++源代码文件
.h程序所包含的头文件
.i预处理过的C原代码文件
.ii预处理过的C++源代码文件
.o编译后的目标文件
.mObjective -C源代码文件
.out链接器生成的可执行文件
.s汇编语言源代码文件,后期不再进行预处理操作
.S汇编语言源代码文件,后期还会进行预处理操作,可以包含预处理指令
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值