编译链接原理(简述)

编译链接原理

	指令:局部函数内部
	数据:持续整个程序结束

-----------------------------------------------------------------------------------------------------------------------
(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代替;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值