预处理,编译,汇编,链接

一个现代编译器的主要工作流程如下:

源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→汇编器(assembler)→目标代码(objectcode)→连接器(Linker)→可执行程序(executables)

高级语言代码 -----> 可执行二进制代码 的4个阶段:

预处理阶阶段:

  • 主要是进行文本替换、宏展开、删除注释这类简单工作。
  • 通常得到以 .i 结尾的文件。
  • 预处理之后,得到的仅仅是真正的源代码,是高级语言。

编译阶段:

  • 编译器把高级语言翻译为机器语言。
  • 得到 hello.s 文件,这个是汇编语言程序。
  • 不同的高级语言翻译的汇编语言相同。

汇编阶段:

  • 汇编器将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序。
  • 得到.o文件,是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。

链接阶段:

  • 链接器负责 .o 文件的合并。得到的是可执行目标文件。
  • gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去。 函数库一般分为静态库和动态库两种。
  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

于是,带着这个理解看2016年的一道命制的习题:
(2016.12)将高级语言源程序转换为机器目标代码文件的程序是(C)
A. 汇编程序
B. 链接程序
C. 编译程序
D. 解释程序

分析:根据上面的描述,这里需要明确的是机器目标代码文件可不可以用来指代汇编程序文件。按照很多文章的解释,这个就是指汇编程序文本。首先,经过汇编程序以后,得到的是可重定位的二进制目标程序,已经不再是含字符的文件了。此外,处理高级程序的一定是预处理程序或编译程序。汇编处理的对象是汇编程序文本,链接处理的是可重定位二进制程序。因此,这里就是在指代编译程序。

之所以会犹豫是因为,看到机器,很容易联想到就是汇编或者链接之后的东西,这是很难抛开的一个概念障碍。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值