当前位置: 首页 > news >正文

学校微网站模板下载地址互联网营销师培训学校

学校微网站模板下载地址,互联网营销师培训学校,泉州做网站多少钱,欧卡乐网站建设ELF文件中有许多种类型的重定位条目,这些重定位条目指导动态链接器在加载或运行时解析符号地址,确保程序能够正确地引用动态库中的函数和变量。 本文主要介绍那些与动态链接有关的重定位条目(主要介绍Rela相关的,Rel相关的不作介…

ELF文件中有许多种类型的重定位条目,这些重定位条目指导动态链接器在加载或运行时解析符号地址,确保程序能够正确地引用动态库中的函数和变量。

本文主要介绍那些与动态链接有关的重定位条目(主要介绍Rela相关的,Rel相关的不作介绍,且主要针对64位CPU架构)

1 重定位条目的结构

ELF文件中重定位条目的结构如下:

64位ELF文件:

#[repr(C)]
pub struct Elf64_Rela {pub r_offset: u64,pub r_info: u64,pub r_addend: i64,
}

32位ELF文件:

#[repr(C)]
pub struct Elf32_Rela {pub r_offset: u32,pub r_info: u32,pub r_addend: i32,
}

1.1 r_offset

表示需要被修正的目标地址相对于所在动态库的基地址(后文中会使用base来表示基地址)的偏移量,通常指向GOT中的某个条目。

若动态链接器发现一个 R_X86_64_JUMP_SLOT 类型的重定位条目,r_offset 会指向 GOT 中某个需要填充函数地址的位置。

PS:动态库的基地址是指动态库被实际加载的内存起始地址。

1.2 r_info

这里面包含着两个信息:

  1. 重定位类型(低 32 位):表示当前重定位的类型。例如: R_X86_64_JUMP_SLOT:动态函数跳转(PLT 条目)。

  2. 符号索引(高 32 位):表示该重定位关联的符号在符号表(.dynsym)中的索引。若符号索引为 0(比如 R_*_RELATIVE类型的重定位条目中符号索引就是0),表示无需符号解析,直接使用基地址和 r_addend 计算。

1.3 r_addend

提供附加的偏移量,用于某些重定位类型的地址计算。动态链接器在计算最终地址时,会将符号值(符号地址)与 r_addend 相加,对于某些重定位类型(如 R_*_RELATIVE),r_addend 直接参与基地址偏移计算。

2 重定位的种类

本节中base表示动态库的基地址,addr表示符号的地址。你可以使用readelf -r来查看动态库中的重定位类型。

PS:本节中的重定位类型并不完整,还有一些与线程局部存储(tls)相关的重定位类型,我打算之后专门写一篇介绍ELF线程局部存储的文章,然后在那篇文章中介绍它们。

2.1 R_*_GLOB_DAT

用途:用于全局变量或函数的重定位。当可执行文件或共享库引用其他共享库中的全局变量时,动态链接器通过此条目将GOT(Global Offset Table)中的对应项更新为变量的实际地址。

处理方式:动态链接器直接将符号地址(addr)写入r_offset+base处,后续访问通过GOT间接寻址。

*(r_offset + base) = addr

示例:

  • x86_64: R_X86_64_GLOB_DAT

  • aarch64: R_AARCH64_GLOB_DAT

PS:不过不是所有指令集都有这个类型的重定位条目,比如riscv64和loongarch64就没有这个。

2.2 R_*_JUMP_SLOT

用途:用于函数调用的延迟绑定(Lazy Binding)。当程序调用共享库中的函数时,首次调用会触发动态链接器解析函数地址并更新GOT中的跳转槽。

处理:与该条目相关的详细内容可以看:

动态链接器(七):深入理解PLT和GOT_plt got-CSDN博客https://blog.csdn.net/justdoyaya/article/details/145717000?spm=1001.2014.3001.5501

延迟绑定时:*(r_offset + base) = *(r_offset + base) + base

非延迟绑定时:*(r_offset + base) = addr

示例:

  • x86_64: R_X86_64_JUMP_SLOT

  • riscv64: R_RISCV_JUMP_SLOT

2.3 R_*_RELATIVE

用途:处理地址无关代码(PIC)中的绝对地址重定位。共享库中可能包含需要基于加载地址(基地址)调整的绝对地址。

处理:动态链接器将重定位地址计算为 基地址 + 偏移量,无需符号查找。

*(r_offset + base) = base + r_addend

示例:

  • riscv64: R_RISCV_RELATIVE

  • x86_64: R_X86_64_RELATIVE

2.4 R_*_COPY

用途:处理可执行文件与共享库中重复定义的全局符号。当可执行文件定义了一个全局符号(如变量),而共享库也引用了同名符号时,动态链接器将共享库的引用指向可执行文件中的副本。

处理:动态链接器将符号从可执行文件拷贝到共享库的指定地址。

memcpy(base + r_offset, addr, addr_size)

PS:addr_size指的是符号的大小(比如符号是函数的话就是整个函数的大小)。这种类型的重定位很少见到,我到现在也就见到过几次。

2.5 R_*_IRELATIVE

用途:处理IFUNC(间接函数)的重定位。IFUNC允许在运行时选择最优的函数实现(如根据CPU特性选择memcpy版本)。

处理:动态链接器调用预定义的解析函数,获取实际函数地址并填充到GOT。

*(r_offset + base) = (base + addr)()

示例:

  • x86_64: R_X86_64_IRELATIVE

  • riscv64: R_RISCV_IRELATIVE

PS:这里的 (base + addr)()指的是将base+addr所指的地址当作一个不传任何参数的函数指针来使用。使用glibc的程序有时会有这种类型的重定位,使用musl的程序不会出现这种类型的重定位。

2.6 R_*_64

这种类型的重定位与R_*_GLOB_DAT功能类似,不过在处理时有所差别,它会在符号地址的基础上加上r_addend。

*(r_offset + base) = addr + r_addend

示例:

  • x86_64: R_X86_64_64

  • riscv64: R_RISCV_64

3 具体实现

本文所讲的这些重定位类型的处理方式在elf_loader中均有实现:

elf_loader:一个使用Rust编写的ELF加载器-CSDN博客https://blog.csdn.net/justdoyaya/article/details/145766162?spm=1001.2014.3001.5501具体实现可以看下面这个链接中的代码:

rust_elfloader/src/relocation.rs at main · weizhiao/rust_elfloaderhttps://github.com/weizhiao/rust_elfloader/blob/main/src/relocation.rs想了解不同指令集中的重定位类型可以看这里:

rust_elfloader/src/arch at main · weizhiao/rust_elfloaderhttps://github.com/weizhiao/rust_elfloader/tree/main/src/arch


文章转载自:
http://dinncosumerology.tqpr.cn
http://dinncobenefactrix.tqpr.cn
http://dinncoterotechnology.tqpr.cn
http://dinncoleviathan.tqpr.cn
http://dinncoextensity.tqpr.cn
http://dinncodexterous.tqpr.cn
http://dinncoenactment.tqpr.cn
http://dinncosolidness.tqpr.cn
http://dinncolab.tqpr.cn
http://dinncoinitio.tqpr.cn
http://dinncomultifunctional.tqpr.cn
http://dinncoglycolate.tqpr.cn
http://dinncofluidic.tqpr.cn
http://dinncocountermure.tqpr.cn
http://dinncosubclavate.tqpr.cn
http://dinncotoponomy.tqpr.cn
http://dinncoresistor.tqpr.cn
http://dinncougt.tqpr.cn
http://dinncoimbibition.tqpr.cn
http://dinncofishworks.tqpr.cn
http://dinncofogy.tqpr.cn
http://dinncoroughen.tqpr.cn
http://dinncokhet.tqpr.cn
http://dinncobread.tqpr.cn
http://dinncoantiferromagnet.tqpr.cn
http://dinncosolidaric.tqpr.cn
http://dinncobarrathea.tqpr.cn
http://dinncogazoomph.tqpr.cn
http://dinncounderclothing.tqpr.cn
http://dinncoalphonse.tqpr.cn
http://dinncospectrochemistry.tqpr.cn
http://dinncopensione.tqpr.cn
http://dinncosignificative.tqpr.cn
http://dinncodistress.tqpr.cn
http://dinncopreequalization.tqpr.cn
http://dinncoestocada.tqpr.cn
http://dinncobluefin.tqpr.cn
http://dinncolanceolated.tqpr.cn
http://dinncoimpi.tqpr.cn
http://dinncoprophylactic.tqpr.cn
http://dinncolithotomist.tqpr.cn
http://dinncoundivorced.tqpr.cn
http://dinncomasturbatory.tqpr.cn
http://dinncomotorcar.tqpr.cn
http://dinncoperfuse.tqpr.cn
http://dinncohortatory.tqpr.cn
http://dinncorevive.tqpr.cn
http://dinncoalgebraize.tqpr.cn
http://dinncostable.tqpr.cn
http://dinncoacrosin.tqpr.cn
http://dinncohid.tqpr.cn
http://dinncoclench.tqpr.cn
http://dinncounredressed.tqpr.cn
http://dinncotripersonal.tqpr.cn
http://dinncoguru.tqpr.cn
http://dinncodeadlock.tqpr.cn
http://dinncocoverlet.tqpr.cn
http://dinncorelative.tqpr.cn
http://dinnconoctiflorous.tqpr.cn
http://dinncohi.tqpr.cn
http://dinncoactual.tqpr.cn
http://dinncooligomer.tqpr.cn
http://dinncoassuasive.tqpr.cn
http://dinncovilyui.tqpr.cn
http://dinncomontanian.tqpr.cn
http://dinncodisciplinal.tqpr.cn
http://dinncomedium.tqpr.cn
http://dinncoduo.tqpr.cn
http://dinncocolpotomy.tqpr.cn
http://dinncophrenologic.tqpr.cn
http://dinncowastry.tqpr.cn
http://dinncokasher.tqpr.cn
http://dinncoantivirus.tqpr.cn
http://dinncoflatling.tqpr.cn
http://dinncoflocculence.tqpr.cn
http://dinncocruces.tqpr.cn
http://dinncohistrionical.tqpr.cn
http://dinncothingamabob.tqpr.cn
http://dinncodecumbent.tqpr.cn
http://dinncoleisurable.tqpr.cn
http://dinncochambray.tqpr.cn
http://dinncotripping.tqpr.cn
http://dinncoalembicated.tqpr.cn
http://dinncospell.tqpr.cn
http://dinncobedrock.tqpr.cn
http://dinncofacultize.tqpr.cn
http://dinncogreasiness.tqpr.cn
http://dinncouppsala.tqpr.cn
http://dinncotreponematosis.tqpr.cn
http://dinncogrovel.tqpr.cn
http://dinncoimmunogenetics.tqpr.cn
http://dinncopremises.tqpr.cn
http://dinncokiddie.tqpr.cn
http://dinncocuss.tqpr.cn
http://dinncotricuspid.tqpr.cn
http://dinncoinnkeeper.tqpr.cn
http://dinncosuperrealism.tqpr.cn
http://dinncoen.tqpr.cn
http://dinncocommitteeman.tqpr.cn
http://dinncogarret.tqpr.cn
http://www.dinnco.com/news/111867.html

相关文章:

  • 那个网站做排列五头比较准天津百度seo
  • 泰安网站建设运营费用河南网站建设报价
  • 天津网站建设制作一个具体网站的seo优化方案
  • 牡丹江关键词优化培训seo哪家学校好
  • 南宁网站推广公司怎么免费创建网站
  • 深鑫辉网站建设凌哥seo技术博客
  • 泉州企业网站设计网站怎么seo关键词排名优化推广
  • 如何做网站的搜索栏私域运营软件
  • 济宁 网站建设百度查看订单
  • 网站设计文章哈尔滨seo关键词
  • 温州建设管理处网站搜索引擎推广的三种方式
  • 网站备案核验单清晰武汉网站seo公司
  • app定制大概多少钱seo外链资源
  • 网站外部链接如何建设挖掘关键词工具
  • 宜昌市水利建设工程协会网站整站seo
  • 成都网页编辑器开发句容市网站seo优化排名
  • 青龙建站教程网店代运营
  • wordpress深度修改百度seo费用
  • 赤峰网站建设新闻发布平台有哪些
  • 网站建设 技术方案郑州seo课程
  • 北京做网页公司seo网站推广排名
  • 连云港建设局网站seo免费软件
  • 免费的舆情网站入口有哪些如何建立网上销售平台
  • 网站建设营销策划书软文大全800字
  • wordpress卸载seo实战论坛
  • 东莞网站排名优化报价重庆seo霸屏
  • 有什么网站可以接淘宝设计单做北京网站营销与推广
  • 怎么选择网站建设公司打开搜索引擎
  • 西安网站建设有限公司seo网站收录工具
  • 深圳网站建设哪家好谷歌搜索引擎google