首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从共享对象计算符号的运行时地址(ELF)

从共享对象计算符号的运行时地址(ELF)是一种用于描述共享对象文件格式的标准。ELF是一种可执行文件格式,用于在操作系统中加载和执行程序。它定义了共享对象文件的结构和组织方式,包括代码段、数据段、符号表、重定位表等。

ELF具有以下几个主要特点和优势:

  1. 可移植性:ELF是一种跨平台的文件格式,可以在不同的操作系统和硬件架构上使用。这使得开发人员可以轻松地将程序移植到不同的平台上运行。
  2. 动态链接:ELF支持动态链接,可以将共享对象文件与程序在运行时进行链接。这样可以减小可执行文件的大小,并且可以在运行时加载和卸载共享对象,提高程序的灵活性和可维护性。
  3. 符号表:ELF文件包含符号表,记录了共享对象中定义和引用的符号信息。这使得程序可以在运行时解析符号引用,实现函数调用和变量访问。
  4. 重定位:ELF文件包含重定位表,记录了需要在加载时进行地址重定位的符号引用。这样可以将共享对象加载到任意内存地址,并解决符号引用的地址问题。
  5. 调试信息:ELF文件可以包含调试信息,用于调试和分析程序。这些信息包括源代码行号、变量名、函数名等,可以帮助开发人员进行程序调试和性能优化。

ELF文件在云计算领域和软件开发中有广泛的应用场景,包括但不限于:

  1. 虚拟化技术:云计算平台通常使用虚拟化技术来提供虚拟机实例。ELF文件作为虚拟机镜像的一部分,可以在虚拟机中加载和执行。
  2. 容器化技术:容器化技术如Docker使用ELF文件作为容器镜像的基础。容器镜像中包含了应用程序的ELF文件和相关依赖,可以在不同的容器环境中运行。
  3. 微服务架构:ELF文件作为共享对象的形式,可以被多个微服务共享和调用。这样可以实现服务的模块化和复用,提高系统的可维护性和扩展性。
  4. 云原生应用开发:云原生应用开发倡导使用容器和微服务架构,ELF文件作为容器镜像的一部分,可以在云原生平台上进行部署和管理。

腾讯云提供了一系列与云计算相关的产品,包括但不限于:

  1. 云服务器(ECS):提供弹性计算能力,支持在云上运行各种类型的应用程序。链接地址:https://cloud.tencent.com/product/cvm
  2. 云原生容器服务(TKE):提供容器化应用的部署和管理平台,支持Kubernetes集群。链接地址:https://cloud.tencent.com/product/tke
  3. 云数据库(CDB):提供可扩展的数据库服务,包括关系型数据库和NoSQL数据库。链接地址:https://cloud.tencent.com/product/cdb
  4. 人工智能平台(AI Lab):提供人工智能相关的开发和部署工具,包括机器学习、自然语言处理等。链接地址:https://cloud.tencent.com/product/ailab

以上是对从共享对象计算符号的运行时地址(ELF)的概念、分类、优势、应用场景以及腾讯云相关产品的介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

动态链接相关结构

这时候,可执行文件里对于很多外部符号引用还处于无效地址状态,即还没有跟相应共享对象实际位置链接起来。...,比如依赖于哪些共享对象、动态链接符号位置、动态链接重定位表位置、共享对象初始化代码地址等。...在动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入符号时,那么它代码或数据中就会有对于导入符号引用。...但是在动态链接中,导入符号地址运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位; 我们在前面地址无关章节中也提到过,动态链接可执行文件使用是PIC方法,但这不能改变它需要重定位本质...是的,PIC共享对象也是需要重定位; 对于使用PIC技术可执行文件或共享对象来说,虽然它们代码段不需要重定位(因为地址无关),但是数据段还包含了绝对地址引用,因为代码段中绝对地址相关部分被分离了出来

1.7K20

ELF文件及android hook原理

与普通程序不同是,动态链接模块装载地址地址0x00000000开始,这个地址是无效共享对象最终装载地址在编译时时不确定,而是在装载时,装载器根据当前地址空间空前情况,动态分配一块足够大小虚拟地址空间给相应共享对象...我们还需要有一种更好方法解决共享对象指令中对绝对地址重定位问题。...程序开始执行时,动态链接器都要进行一次链接工作,会寻找并装载所需共享对象,然后进行符号查找地址重定位等工作,如此一来,程序运行速度必定会减慢。....dynamic段 这个段里保存了动态链接器所需要基本信息,比如依赖哪些共享对象、动态链接符号位置、动态链接重定位表位置、共享对象初始化代码地址等。...用readelf查看elf文件动态符号表及它哈希表。 ? 动态链接重定位表 在动态链接中,导入符号地址运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位。

3.9K81
  • 深度解密Android中基于pltgothook实现原理

    动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入符号时(比如fwrite函数),那么它代码或数据中就会有对于导入符号引用。...在编译时这些导入符号地址未知,在运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位。...5.1 .dynsym开始 .dynsym:上面也说到了,这个节里只保存了与动态链接相关符号导入导出关系。...可以看到我们libc库中导入函数fwrite,这个偏移和我们刚才计算偏移是一致都是:0x2FE0。 5.3 如何定位基址?...6.2、保存原始调用地址 当我们自己共享库完成对目标共享hook操作之后,要保证功能正常运行,需要先保存原始函数调用地址。 6.3、解析ELF文件头部 ?

    3.5K20

    动态链接步骤与实现

    然后链接器开始集合里取个所需要共享对象名字,找到相应文件后打开该文件,读取相应ELF文件头和“ .dynamic”段,然后将它相应代码段和数据段映射到进程空间中。...如果这个ELF共享对象还依赖于其他共享对象,那么将所依赖共享对象名字放到装载集合中。...由于存在这种重名符号被直接忽略问题,当程序使用大量共享对象时应该非常小心符号重名问题,如果两个符号重名又执行不同功能,那么程序运行时可能会将所有该符号引用解析到第-个被加入全局符号使用该符号符号...在前面介绍动态链接重定位表时,我们已经碰到了几种重定位类型,每种重定位入口地址计算方法我们在这里就不再重复介绍了。...在这种情况下,动态链接器就会解析运行时参数,并且进行相应处理_dl_main本身非常长,主要工作就是前面提到对程序所依赖共享对象进行装载、符号解析和重定位,我们在这里就不再详细展开了,因为它实现细节又是一个非常大的话题

    1.4K20

    《程序员自我修养》笔记

    ”和“0xFFFFFFFC”代替着(因为是外部库符号,所以在编译程序时候会先用固定地址代替),把真正地址计算工作留给了链接器。...运行时候动态链接器会首先加载动态链接共享库到内存里,此时虚拟地址和物理地址都确定了,接着就可以修改数据段里面的got了,got中匹配符号 记录符号真正存储虚拟地址(数据段重定位运行时不同进城有副本切可以随意修改...另外一个减慢运行速度原因是动态链接链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作,正如我们上面提到,动态链接器会寻找并装载所需要共享对象,然后进行符号查找地址重定位等工作...并 调用动态链接解析器函数 去加载模块到内存并把加载后符号地址 存入到got中,这样下一次就会got中找到地址然后跳转运行。...但这不能改变它需要重定位本质 对于使用PIC技术可执行文件或共享对象来说,虽然它们代码段不需要重定位(因为地址无关,动态链接器加载完模块后会修正got里面记录地址) ,但是数据段每个进程都会加载

    9510

    CSAPP---第七章-链接

    count是全局符号,根据type可知符号表示是一个数据对象类型,它所在节头部表索引为3,可以定位到.data节中,再根据value表示在.data节中偏移量得到对象地址,size表示对象大小。...ELF 头描述文件总体格式。它还包括程序入口点(entry point),也就是当程序运行时要执行第一条指令地址。...除了一些头部信息,在加载过程中没有任何磁盘到内存数据复制。直到 CPU 引用一个被映射虚拟页时才会进行复制,此时,操作系统利用它页面调度机制自动将页面磁盘传送到内存。...被编译为位置无关代码共享库可以加载到任何地方,也可以在运行时被多个进程共享。为了加载、链接和访问共享函数和数据,应用程序也可以在运行时使用动态链接器。...---- 参考 《深入理解计算机操作系统》第七章 【CSAPP-深入理解计算机系统】7-1.

    89410

    【胖虎逆向之路】——GOTPLT Hook详解&针对自定义so库Hook实操

    ELF 作为一种可移植格式,被 TIS 应用于基于 Intel 架构 32 位计算各种操作系统上。...ELF 文件格式规范由 TIS(Tool Interface Standards – 工具接口标准)委员会制定, TIS 委员会是一个微型计算机工业联合组织,它致力于为 32 位操作系统下开发工具提供标准化软件接口...使用~ 当so动态库被装载时候,动态链接器linker会将动态库装载到进程地址空间,并且将程序中所有没确定符号绑定到相应动态链接库中,并进行重定位工作~ 3、重定位 共享库进行重定位主要原因是在于导入符号原因...,在动态链接下,可执行文件如果依赖于其他共享对象,也就是说有导入符号时(比如easy_curl_getopt函数),那么它代码或数据中就会有对于导入符号引用,在编译时这些导入符号地址未知,在运行时才确定...,所以需要在运行时将这些导入符号引用修正,即需要重定位 动态链接文件中,有专门重定位表分别叫做.rel.dyn和.rel.plt:(刚才看表时候有圈起来哦) R_AARCH64_GLOB_DA

    1K41

    深入浅出ELF

    ),静态编译可执行文件 ET_DYN: 共享对象(shared object),动态编译可执行文件或者动态库*.so ET_CORE: coredump文件 e_entry是程序入口虚拟地址,注意不是...因为动态库本身是位置无关(PIE),支持被加载到内存中随机位置,因此为了程序中用到符号可以被正确引用,需要对其进行重定向操作,指向对应符号真实地址。...破解这种加固方法策略就是将其内存中复制出来并进行重建,重建过程可根据segment对section进行还原,因为segment和section之间共享了许多内存空间,例如: $ readelf -...在介绍ELF类型时候其实有提到,可执行文件可以有两种类型,即可执行类型(ET_EXEC)和共享对象(ET_DYN),一个动态链接可执行程序默认是共享对象类型: $ gcc hello.c -o hello...$ readelf -h hello | grep Type Type: DYN (Shared object file) 而动态库(.so)本身也是共享对象类型,他们之间本质区别在于前者链接了

    78530

    扒一扒ELF文件

    ELF文件类型 2.1 可重定位目标文件(.o文件) 2.2 可执行目标文件(a.out文件) 2.3 共享对象文件(.so文件) 3. ELF文件作用 4....例如编译好可执行文件a.out。 2.3 共享对象文件(.so文件)   用于和其他共享目标文件或者可重定位文件一起生成ELF目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 3....编译和链接角度看ELF文件 .symtab section   符号表,它存放在程序中定义和引用函数和全局变量信息。...共享库文件是一种特殊可重定位目标。   2.ELF目标文件格式可以编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。...3.bss段在可执行目标文件中不会有它空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0。 本文参考《深入理解计算机系统》

    74420

    链接 动态链接 静态链接

    符号解析目的是将每个符号引用和一个符号定义联系起来 重定位 编译器和汇编器生成地址零开始代码和数据节。...ELF文件,现在就来看看经过静态链接生成可执行目标文件ELF文件格式,这里面都是以段作为术语: 可执行目标文件ELF文件 ELF头部 段头表 .init .text .rodata .data....bss .symtab .debug .line .strtab 节头表 随即这些段就会被加载到存储器地址中,也就是大名鼎鼎存储器结构,包含栈堆,内核等等结构。...像一些glibc提供函数,我们可能随时随处都会用上,如果我们每次把函数代码复制到每个进程文本段中,这无疑是一种浪费资源,所以出来了共享概念,在运行时,可以加载到任意存储器地址,并在存储器中和一个程序链接起来...共享库也叫共享目标,以.so为结尾,像linux系统提供了dlopen这样函数去加载和链接共享库。 其实.symtab这个存放符号地方也是值得研究,有机会再记录。

    2.9K30

    程序员角度看ELF

    (这里针对ELF可执行文件,对于共享.init段,还是由interpreter来调用!!!...这里特定解释器是动态链接器,即ld.so,它自己也是ELF   共享格式。...链接器然后通过指向程序符号表和链接器自己符号若干指针来初始化一个符号   表链。概念上讲,程序文件和所有加载到进程中库会共享一个符号表。...但实际中链接器   并不是在运行时创建一个合并后符号表,而是将个个文件中符号表组成一个符号表链。   ...链接器可以通过计算符号散列值,然后访问相应散列队列进行查找以加速   符号搜索速度。   库查找   链接器自身初始化完成之后,它就会去寻找程序所需要各个库。

    99140

    Linux 程序编译过程详解

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库不同点在于代码被载入时刻不同。静态库代码在编译过程中已经被载入可执行程序,因此体积较大。共享代码是在可执行程序运行时才载入内存,在编译过程中仅简单引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖共享库。objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。objdump:主要作用是反汇编。...链接器将函数代码其所在地(不同目标文件或静态链接库中)拷贝到最终可执行程序中。...为创建可执行文件,链接器必须要完成主要任务是:符号解析(把目标文件中符号定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号引用)。

    1.9K30

    PWN入门到放弃(7)——栈溢出之ret2libc

    当这两个程序运行时,内存中同样也就包含了这两个相同模块,这也就使得内存空间被浪费。当系统中包含大量类似lib.o这种被多个程序共享模块时,也就会造成很大空间浪费。...Linux系统中,ELF动态链接文件被称为动态共享对象(Dynamic Shared Objects),简称共享对象一般都是以 “.so” 为扩展名文件,在pwn中我们常称之为libc库;在windows...计算偏移量和覆盖返回地址不再演示,和之前一样,这里主要讲解一下payload构造。 32位ELF程序通过栈来传递参数,而64位ELF程序则是通过rdi寄存器来传递参数。...我们已经成功将puts函数实际地址打印出来。 那么接下来就简单许多,我们需要计算libc地址,并利用libc基地址计算system()函数和/bin/sh字符串地址。...接下来计算system()和/bin/sh地址

    86510

    Linux 程序编译过程详解

    1 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库不同点在于代码被载入时刻不同。静态库代码在编译过程中已经被载入可执行程序,因此体积较大。共享代码是在可执行程序运行时才载入内存,在编译过程中仅简单引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖共享库。 objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。 objdump:主要作用是反汇编。...链接器将函数代码其所在地(不同目标文件或静态链接库中)拷贝到最终可执行程序中。...为创建可执行文件,链接器必须要完成主要任务是:符号解析(把目标文件中符号定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号引用)。

    1.9K30

    Linux 程序编译过程来龙去脉

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。...静态库和动态库不同点在于代码被载入时刻不同。静态库代码在编译过程中已经被载入可执行程序,因此体积较大。共享代码是在可执行程序运行时才载入内存,在编译过程中仅简单引用,因此代码体积较小。...ldd:可以用于查看一个可执行程序依赖共享库。 objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。 objdump:主要作用是反汇编。...链接器将函数代码其所在地(不同目标文件或静态链接库中)拷贝到最终可执行程序中。...为创建可执行文件,链接器必须要完成主要任务是:符号解析(把目标文件中符号定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号引用)。

    2.9K30

    后台开发:核心技术与应用实践 -- 编译与调试

    链接主要内容就是把各个模块之间相互引用部分都处理好,使得各个模块之间能够正确衔接。原理上讲,它工作就是把一些指令对其他符号地址引用加以修正。...在运行时,动态链接器拿它和一个可执行目标文件以及另外一些可共享目标文件 ( .so ) 来 起处理,在 Linux 系统里面创建一个进程映像 有两种视图可以来说明 ELF 组成格式,即链接视图和执行视图...组成不同可重定位文件,以参与可执行文件或者可被共享对象文件链接。2. 组成可执行文件或者可被共享对象文件,以在运行时内存中进程映像构建。构建对象文件组成如表: ?...ELF 文件头被固定地放在不同类对象文件最前面 因此,我们可以用 file 命令来看文件是属于哪种 ELF 文件,如下: ?...、变量名,所代替全是运行时内存地址

    76210

    ELF文件格式简介

    另外,不同对象文件类型符号表条目对 st_value 成员解释略有不同: 在重定位文件中在可重定位文件中,st_value保存节索引为SHN_COMMON符号对齐约束; 在可重定位文件中,st_value...也就是说,st_value是st_shndx标识部分开头偏移量; 在可执行文件和共享对象文件中,st_value保存一个虚拟地址。...15)]:预留位,用于特殊处理器特定含义; TYPE: STT_NOTYPE(0):符号类型未指定; STT_OBJECT(1):符号与数据对象相关联,例如变量、数组等; STT_FUNC(2):...当链接编辑器将此对象文件与另一个定义指定符号文件组合时,此文件对符号引用将链接到实际定义; st_other:该成员当前持有 0 并且没有定义含义; st_shndx:每个符号都有属于节,当前成员存储就是对应节索引...这是因为dynsym中符号只有在动态链接时也就是运行时才能被解析。

    2.2K31

    二进制学习系列-栈溢出之Passcode详解

    作用:把位置无关地址计算重定位到一个绝对地址。...程序首次调用某个库函数时,运行时连接编辑器(rtld)找到相应符号,并将它重定位到GOT之后每次调用这个函数都会将控制权直接转向那个位置,而不再调用rtld。...动态连接器并不会把动态库函数在编译时候就包含到ELF文件中,仅仅是在这个ELF被加载时候,才会把那些动态函库数代码加载进来,之前系统只会在ELF文件中GOT中保留一个调用地址. ---- GOT覆写技术...然后GOT表中去寻找该函数地址,GOT表中有相应各个函数地址,由于PLT表是只读,但是GOT表是可读。 PLT —> 函数地址指针 ,GOT —> 函数地址。...如果scanf没加&的话,程序会默认栈中读取4个字节数据当做scanf取地址

    1.1K41

    编译、链接到载入、运行大致过程----3.载入

    文件,因为并不对外提供函数接口,所以其符号 在编译过程中已经被替换为程序虚拟地址;因此“executable” elf文件是"stripped"; 程序载入过程: 当我们运行一个程序时候,操作系统打开程序文件做完相应处理后...载入内存后,在运行时候,访问地址是: 内存虚拟地址。这个内存虚拟地址 并不是 “程序虚拟地址”,也不是“内存物理地址”;但是 这三者之间是有关系: A....地址范围,也可以通过 readelf -S 来获取对应section地址,从而计算出segment地址; B....,一般对于"executable"elf文件来说,其 内存虚拟地址 和程序虚拟地址是相同, 而 "shared object"程序虚拟地址(TYPE=LOADsegment) 总是0开始,这个地址...这一点在ldd 命令结果中体现非常明显,我们知道ldd输出结果表示对相应共享依赖,其输出结果最后一节是一个地址,而这个地址就是:内存虚拟地址;每次用ldd去查看其依赖时候,这个地址都是发生变化

    2.3K30
    领券