ELF文件与库的原理

发布时间:2026/7/24 19:55:53

ELF文件与库的原理 库的制作和原理1 ELF文件ELF文件主要包含以下4种可重定位文件xxx.o)可执行文件共享目标文件xxx.so)内核转储ELF的文件构成1.ELF header:用于定位文件的其他部分2.Program header table:列举了所有有效段及其属性包括每个段的起始位置和位移长度3.Section header table:包含对节section)的描述4.Section:ELF文件的各种信息和数据都存储在不同的节中如代码节存储了可执行代码数据节存储了全局变量和静态数据等其中节头表section header table用于链接时链接器将section合并成segment(优化内存管理和方便权限访问控制程序头表program header table用于加载时告诉操作系统如何加载文件完成进程内存的初始化readelf基本语法; readelf 选项 elf文件-h显示ELF文件头架构字节序入口点地址等-S显示节区表如.text,.data的详细位置和大小[16].text(代码段存储机器指令的地方其中glags是AXA代表Alloc(运行时分配内存X代表Execute(可执行[18].rodata(只读数据段它的flags只有A没有Wwrite)说明这块内存运行时是被保护的[25].data(已初始化数据段[26].bss(未初始化数据段其它节区大都type为PROGBITS而.bss是NOBITS这意味着它在磁盘上的ELF文件中不占用实际的物理空间只记录需要多少字节直至程序被加载到内存运行时操作系统才会给它分配空间-l显示程序头表展示系统如何将文件加载进内存这里就清楚展示了链接器会把具有相同访问权限的section打包为一个segment交给OS载入-s显示符号表包含程序中定义和引用的所有函数和全局变量-d显示动态节区可以查看程序依赖哪些共享库。。。。。。ELF加载与进程地址空间1 ELF文件在没被加载到内存之前就有地址ELF对自己的代码和数据进行统一编址(起始地址偏移量其中起始地址为0进程mm_struct,vm_area_struct在创建时的初始化数据来自ELF文件的segment所以虚拟地址需要OS和编译器2 动态库加载动态链接实际上是在程序加载时才会进行链接的整个过程动态库的调用是在进程地址空间从代码区跳转到共享区而访问库中的方法只需要库的起始虚拟地址方法的偏移量但是程序每次运行把库加载并映射的时候库的起始虚拟地址都会改变所以调用处的地址也会因变化而进行修改为了维护代码区的只读动态链接采用的是GOT全局偏移量表数据区相当于是又包装了一层以表的一一对应的特性实现了不变与变的统一自然的每个进程就有自己独立的GOT表因为不同进程对库的虚拟编址不同而地址也就变成了got表地址表中偏移量。。。。。。-延迟绑定PLT(程序开始—第一次调用降低开销反汇编指令objdump -d 文件(当然还可以搭配**|**管道符等使用

相关新闻