汇编⽂件后缀.s与.S
⼀、⼤⼩写后缀的区别
.s    汇编语⾔源程序;汇编
.S    汇编语⾔源程序;预处理,汇编
⼩写的s⽂件,在后期阶段不在进⾏预处理操作,所以我们不能在这⾥⾯写预处理的语句在⾥⾯
⼤写的S⽂件,还会进⾏预处理、汇编等操作,所以我们可以在这⾥⾯加⼊预处理的命令
⼆、编译的相关流程
html代码转链接
预处理(Pre-Processing)-->编译(Compiling)-->汇编(Assembling)-->链接(Linking)
1、预处理器
根据以字符#开头的命令(directives),修改原始的C程序。
这个阶段并不会去检查代码的错误,只会把#的语句转成C代码。
2、编译阶段
在这个阶段中,Gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,Gcc把代码翻译成汇编语⾔。⽤户可以使⽤”-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。汇编语⾔是⾮常有⽤的,它为不同⾼级语⾔不同编译器提供了通⽤的语⾔。如:C编译器和Fortran编译器产⽣的输出⽂件⽤的都是⼀样的汇编语⾔。
3、汇编阶段
汇编阶段是把编译阶段⽣成的”.s”⽂件转成⽬标⽂件,读者在此可使⽤选项”-c”就可看到汇编代码已转化为”.o”的⼆进制⽬标代码了。
4、链接阶段
将库函数(头⽂件中⽤到的)等链接到⽬标⽂件中。
在成功编译之后,就进⼊了链接阶段。在这⾥涉及到⼀个重要的概念:函数库
"stdio.h"中也只有该函数的声明,⽽没有定义函数的实现,那么,是在哪⾥实现”printf”这些库函数的呢?最后的答案是:系统把这些函数实现都被做到名为libc.so.6的库⽂件中去了,在没有特别指定时,
gcc会到系统默认的搜索路径”/usr/lib”下进⾏查,也就是链接到libc.so.6库函数中去,这样就能实现函数”printf” 了,⽽这也就是链接的作⽤。
函数库⼀般分为静态库和动态库两种。静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为”.a”。动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为”.so”,如前⾯所述的libc.so.6就是动态库。gcc在编译时默认使⽤动态库。
完成了链接之后,gcc就可以⽣成可执⾏⽂件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。