这篇文章介绍了c语言执行Hello World背后经历的步骤,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
目标代码优化器对目标代码进行优化,比如选择一个合适的寻址方式等
汇编
汇编是将汇编代码转换成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以这个过程,根据汇编指令和机器指令的对照表,一一分析就可以了。
上面的过程相当于执行了
$gcc -c hello.c -o hello.o
或者
$gcc -c hello.s -o hello.o
或者
$as hello.s -o hello.o
又一次验证了上面的结论,gcc命令对as程序的封装
汇编的结果生成的.o文件叫做目标文件
链接
到目前位置,完成了编译的整个过程,到现在位置,还没有为程序中的变量分配地址,那么什么时候分配地址呢?假设已经分配了地址,那么我们有可能在引用了别的文件中的变量或者函数,那么此时怎么为他们分配地址呢?所以肯定不是在之前分配地址的。
这个过程在链接阶段才能确定,定义在其他文件的全局变量和函数在最终运行时的绝对地址都要在最终链接时才能确定,所以编译器将一个源码文件编译成一个未链接的目标文件,然后由链接器最终将这些目标文件链接起来形成可执行文件。
链接的主要内容就是把各个模块之间相互引用的部分处理好,使各个模块之间能够正确链接,这里所有的模块之间的相互引用是指全局变量的相互引用和函数的相互调用,其实链接的工作就是把一些指令对其他符号的地址的引用加以修正
链接过程主要包括:
- 地址和空间分配
- 符号决议(静态链接)
- 重定位
什么是静态链接呢?
源代码文件经过编译器后生成目标文件,目标文件和库一起链接成可执行文件,这里的库是运行时库,库是一组目标文件的包,就是一些常用的代码编译成目标文件后打包存放
比如有两个文件A.c 和B.c A中使用了B的函数foo()和变量var, 由于每个模块都是单独编译的,所以在编译阶段并不知道函数foo和变量var的地址,所以就将他们地址暂时设置成0,等待链接器将目标文件A和B链接起来的时候再修改正,这个修正的过程叫做重定位,整个过程就是静态链接的基本过程。
以上所述是小编给大家介绍的c语言执行Hello World背后经历的步骤,希望对大家有所帮助。在此也非常感谢大家对编程学习网网站的支持!
本文标题为:c语言执行Hello World背后经历的步骤
- 将 hdc 内容复制到位图 2022-09-04
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- GDB 不显示函数名 2022-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- DoEvents 等效于 C++? 2021-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- XML Schema 到 C++ 类 2022-01-01