计算机系统基础

十. 链接概述和目标文件格式

1. 可执行文件的生成过程

  1. 预处理:处理源文件中以 “#” 开头的预编译指令,包括:

     gcc -E hello.c //生成预处理文件hello.i

    • 删除 "#define" 并展开所定义的宏

    • 处理所有条件预编译指令,如 "#ifdef","#if","#endif"等

    • 插入头文件到"#include"处,可以递归进行处理

    • 删除所有的注释 "//" 和 “/* */

    • 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息

    • 保留所有#progma编译指令(编译器需要用 )

    经过预处理后,得到的文件是预处理文件(如,hello.i),它还是一个可读的文本文件,但不包括任何宏定义

        
    
    809 
     810 /*以下是hello.i文件中的内容一部分,预处理产生的结果很多,个人所写的代码在最后几行*/
     811 extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
     812 # 873 "/usr/include/stdio.h" 3 4
     813 extern FILE *popen (const char *__command, const char *__modes) ;
     814 
     815 
     816 
     817 
     818 
     819 extern int pclose (FILE *__stream);
     820 
     821 
     822 
     823 
     824 
     825 extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__));
     826 # 913 "/usr/include/stdio.h" 3 4
     827 extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
     828 
     829 
     830 
     831 extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
     832 
     833 
     834 extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
     835 # 943 "/usr/include/stdio.h" 3 4
     836 
     837 # 2 "hello.c" 2
     838 int main()
     839 {
     840  printf("hello,world\n");
     841  return 0;
     842 }
                                     
                      
  2. 编译

    • 编译过程就是将预处理得到的预处理文件(如,hello.i) 进行词法分析,语法分析,语义化分析并优化,生成汇编文件

    • 用来进行编译处理的程序称为编译程序(编译器,Compiler)

    • 经过编译后,得到的汇编代码文件(如 hello.s)还是可读的文本文件,CPU无法理解和执行它

    • 编译命令

       gcc -S hello.i 
    • gcc命令实际上是具体程序(如ccp, cc1,as等)的包装命令,用户通过gcc命令来使用具体的预处理程序ccp,编译程序cc1和汇编程序as等

  3. 汇编

    • 汇编代码文件(由汇编指令构成)称为汇编语言源程序

    • 汇编程序(汇编器)用来将汇编语言程序转换为机器指令序列(机器语言程序)

    • 汇编指令和机器指令一一对应,前者是后者的符号表示,它们都属于机器级指令,所构成的程序称为机器级代码

    • 汇编命令

       gcc -c hello.s
    • 汇编结果是一个可重定位目标文件(如,hello.o),其中包含的是不可读的二进制代码,必须用相应的工具软件来查看内容或者反汇编

  4. 链接

    • 预处理,编译和汇编三个阶段针对一个模块(一个*.c文件)进行处理,得到对应的一个可重定位目标文件(一个 *.o文件)

    • 链接过程将多个可重定位目标文件合并以生成可执行目标文件

    • 链接命令

       gcc -static -o prog mian.o test.o
       或者
       ld -static -o prog main.o test.o
       -static表示静态链接,如果不指定-o选项,则可执行文件名字为"a.out"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值