编译链接原理
指令:局部函数内部
数据:持续整个程序结束
-----------------------------------------------------------------------------------------------------------------------
(gcc -E .i)预编译(.c):
宏替换、替换注释、加载头文件、标注行号
-----------------------------------------------------------------------------------------------------------------------
(gcc -S .s)编译(高级语言文本文件——>汇编语言文本文件):
生成指令(函数体,指令)、符号(由函数名、数据生成)
-----------------------------------------------------------------------------------------------------------------------
(gcc -C .o)汇编(汇编语言文本文件——>ELF文件):
生成二进制可重定位文件
-----------------------------------------------------------------------------------------------------------------------
链接(可重定位二进制文件——>二进制可执行文件):
合并各个段,生成可执行的二进制文件(.exe)
-----------------------------------------------------------------------------------------------------------------------
二进制可重定位文件————>二进制可执行文件————>虚拟地址空间
(链接) 读取local表
-----------------------------------------------------------------------------------------------------------------------
cpu:计算
磁盘:存储介质
内存:存储程序运行真实的数据
物理内存:内存条
虚拟内存(交换分区):在磁盘上
虚拟地址空间:32位的cpu会为每个程序维护一个4G的虚拟地址空间
================================================================
总结:
一:Linux下的ELF格式的文件都有哪些?
答:
.o文件 可执行二进制文件、核心转储文件(core dump)、
.so文件(动态链接库文件)
二:可执行文件的结构组成
File Header :文件头(已经初始化的全局static )
.text(存放指令)
.data(存放数据)
.bss .comment
三:深入挖掘.o文件(ELF格式文件)
答:常用命令:
查看.o文件的文件头详细信息
readelf -h file.o
显示.o文件中的所有段,即查看段表
readelf -S file.o
查看.o文件中各个段所占大小
size file.o
查看.o文件中所有的符号
nm file.o
打印主要段的信息
objdump -h file.o
打印更多详细信息
objdump -x file.o
将所有段的内容以十六进制的打印出来
objdump -s file.o
将所有含有指令的段反汇编
objdump -d file.o
(数据和函数名可生成符号)
查看所有的符号以及所在段
objdump -t file.o
强符号替换弱符号:
b.c中
int a;
void fun()
{
a = 30;
}
a.c中
#include <stdio.h>
void fun();
short a = 10;
short b = 20;
int main()
{
fun();
printf("a = %d b = %d\n", a, b);
return 0;
}
编译:fun()给b.c中的a赋值30;
链接:b.c中的a是弱符号,被a.c中的强符号a代替;