Linux c==静态链接的空间和地址分配(16)
2016-11-19 22:25
246 查看
多个文件链接在一起的时候,会做到相似段合并,数据段在一起,代码段在一起。
这样能节省空间,对于x86的硬件来说段的装载地址和空间的对齐单位是页,是4096个字节,如果一个个段分开存放,会造成大量的内部碎片。
链接器为目标文件分配空间和地址:
【1】输出的可执行文件的空间
【2】装载后的虚拟地址的虚拟地址空间
a.c
b.c
操作:gcc -c a.c b.c
生成a.o b.o
操作:ld a.o b.o -e main -o ab
-e main 使用ld链接器,将main函数作为程序入口
-o ab 获得ab可执行文件
查看各个文件各个段的属性objdump -h a.o b.o ab
分别是:
这里只关心size(大小),VMA(virtual memory addres 虚拟地址)。
// LAM(load memory address 加载地址)
符号地址的确定
a.o中只有main函数所在虚拟地址是0x08048094
b.o中的swap函数在卖弄函数结束之后,main函数大小是0x34,+0x08048094 = 0x080480c8
中的变量shared所在虚拟地址是0x08048108
这样能节省空间,对于x86的硬件来说段的装载地址和空间的对齐单位是页,是4096个字节,如果一个个段分开存放,会造成大量的内部碎片。
链接器为目标文件分配空间和地址:
【1】输出的可执行文件的空间
【2】装载后的虚拟地址的虚拟地址空间
a.c
#include <stdio.h> extern int shared; int main() { int a = 100; swap(&a,&shared); }
b.c
int shared = 1; void swap(int* a, int* b) { (*a) ^= (*b) ^= (*a) ^= (*b); }
操作:gcc -c a.c b.c
生成a.o b.o
操作:ld a.o b.o -e main -o ab
-e main 使用ld链接器,将main函数作为程序入口
-o ab 获得ab可执行文件
查看各个文件各个段的属性objdump -h a.o b.o ab
分别是:
这里只关心size(大小),VMA(virtual memory addres 虚拟地址)。
// LAM(load memory address 加载地址)
符号地址的确定
a.o中只有main函数所在虚拟地址是0x08048094
b.o中的swap函数在卖弄函数结束之后,main函数大小是0x34,+0x08048094 = 0x080480c8
中的变量shared所在虚拟地址是0x08048108
相关文章推荐
- Linux c==静态链接的空间和地址分配
- linux中静态链接的空间和地址分配
- 动态分配空间,地址为16的倍数(地址对齐)
- 【静态链接】第2章---------------------静态链接过程(空间地址分配)
- 静态链接--空间和地址分配
- linux内存学习笔记(二)——设备地址到用户空间
- linux内存学习笔记(二)——设备地址到用户空间
- LINUX_DHCP为不同地址范围的主机分配不同的网络参数
- [Linux内核完全剖析]第五章Linux内核体系结构5.1-5.3总结 Linux内存空间分配
- linux内存管理之非连续物理地址分配(vmalloc
- 安装Linux分配空间
- linux底层内存管理--用户空间的分级分配系统以及懒惰的含义
- linux底层内存管理--用户空间的分级分配系统以及懒惰的含义
- Linux内存线性地址空间布局解析
- VirtualBox中为Fedora16分配数据空间
- Linux2.6-4G的线性地址空间的分配与使用
- linux内存管理之非连续物理地址分配(vmalloc)
- linux-2.6.27移植到AT91SAM9260平台终端之(01)_9260的存储空间分配及其启动方式
- linux底层内存管理--用户空间的分级分配系统以及懒惰的含义
- linux进程空间地址分布