ELF之编译链接
预处理阶段
预处理器根据字符 # 开头的命令展开宏定义、处理条件编译、插入**#include头文件**、删除所有注释、添加行和文件标识,得到一个处理后的C程序,通常以 .i 作为文件扩展名。
对应的命令:
gcc -E hello.c -o hello.i
编译阶段
编译器将文本文件 hello.i 翻译成 hello.s,生成相应的汇编语言程序,主要包括词法分析、语法分析、语义分析、源代码优化、目标代码生成等。
对应的命令:
gcc -s hello.c -o hello.s
汇编阶段
将 hello.s 文件翻译成机器语言指令,把这些指令打包成目标文件 hello.o 中。
对应的命令:
gcc -c hello.c hello.o
链接阶段
在通过以上步骤将一个或多个源文件打包成多个独立的可重定位文件 .o,但是每个可重定位文件中的符号地址还没有进行全局确定,一些符号还没有分配空间,链接过程主要分为:地址和空间分配、符号查找、重定位。
- 地址和空间分配:扫描所有输入文件,获取他们的各个节的位置、长度、属性等信息,将各个相同的节合并到一起,并收集所有符号,集中放置到符号表中。
- 符号查找:符号的查找分为两种,静态链接时由连接器在通过重定位表进行符号查找,动态链接时由运行的的动态连接器在从动态符号表中查找。
- 重定位:程序或数据在入内存后需要对其中的某些存储单元下的指令进行修改,这个过程可以通过链接器和动态连接器完成。
对应的命令:
gcc -c hello.c && ld hello.o -o hello
# 或
gcc -c hello.c -o hello.o && gcc -o hello hello.o
本文链接:
/archives/1726141121356
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
以梦为马!
喜欢就支持一下吧