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

ELF文件及android hook原理

链接器在处理目标文件时,需要对目标文件中某些部位进行定位,即代码段和数据中中那些绝对地址引用位置。对于每个需要定位代码段或数据段,都会有一个相应定位表。...比如”.rel.text”就是针对”.text”定位表,”.rel.data”就是针对”.data”定位表。...第二步 符号解析与定位 使用第一步中收集到信息,读取输入文件中段数据、定位信息,并且进行符号解析与定位、调整代码中地址等 使用ld链接器将”a.o”和”b.o”链接起来: $ld a.o b.o...定位表(Relocation Tabel)专门用来保存与定位相关信息,链接器根据它知道哪些指令时要被调整,以及如何调整。...可以使用objdump来查看目标文件定位表: ? 将”a.o”代码段反汇编可以看到,此时编译器并不知道“shared”地址,暂时把地址0看做”shared”地址。

3.7K81
您找到你想要的搜索结果了吗?
是的
没有找到

动态链接相关结构

从上面给出定义来看,“.dynamic”段里面保存信息有点像elf文件头,只是我们看到elf文件头中保存是静态链接时相关信息,比如静态链接时使用符号表、定位表等,这里换成了动态链接下所使用相应信息了...但是在动态链接中,导入符号地址在运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要定位; 我们在前面地址无关章节中也提到过,动态链接可执行文件使用是PIC方法,但这不能改变它需要定位本质...是的,PIC共享对象也是需要定位; 对于使用PIC技术可执行文件或共享对象来说,虽然它们代码段不需要定位(因为地址无关),但是数据段还包含了绝对地址引用,因为代码段中绝对地址相关部分被分离了出来...动态链接定位相关结构 共享对象定位与我们在前面“静态链接”中分析过目标文件定位十分类似,唯一有区别的是目标文件定位是在静态链接时完成,而共享对象定位是在装载时完成。...我们可以使用 readelf来查看一个动态链接文件定位表 ?

1.7K20

Ubuntu 13.04CentOS 6.4 下C++开发时相关设置

一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认库搜索路径,所以使用这两个目录中库时无需进行配置搜索路径即可直接使用。...需要注意是:第二种搜索路径配置方式对于程式连接时库(包括共享库和静态库)定位已足够了,但是对于使用了共享库程式执行还是不够。...这是因为为了加快程式执行时对共享库定位速度,避免使用搜索路径查找共享库低效率,所以是直接读取库列表文档/etc/ld.so.cache从中进行搜索。.../etc/ld.so.cache 是个非文本数据文档,不能直接编辑,他是根据/etc/ld.so.conf中配置搜索路径由 /sbin/ldconfig命令将这些搜索路径下共享库文档集中在一起而生成.../usr/lib,也是不会被使用,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞想大骂computer蠢猪一个。

66330

Mac OS X安装OpenCV并配置到Xcode和Eclipse上

进入存放解压后opencv文件夹,新建一个空文件夹release,进入该文件夹,编译安装opencv,使用命令如下: tar zxvf OpenCV-2.4.3.tar.bz2...make sudo make install 安装好lib文件存放在“/usr/local/lib”文件夹,h文件存放在“/usr/local/include” 2....Xcode中使用OpenCV: 1).添加lib文件:右键点击工程名,选择“Add files to..”...在GCC C++ Compiler选项列表中选择Includes,在Include paths(-l)中添加安装好opencv头文件存放目录:/usr/local/include/(注意最后面的/不能少.../lib/ 5.MacOS X C++Linker选项列表中选择Library, 在Libraries(-l) 中依次点击“+”号,添加需要使用Lib文件(通常情况下,使用前三个):

64020

Android中关于Nativa编译(NDK、JNI)一些问题

后来游戏接入越来越多,而且大多数游戏使用C++或者各种游戏殷勤,为了降低游戏接入成本,同时也尽可能减少SDK开发成本,SDK为游戏提供了native方法。...SDKC++接口由JNI实现,使用SDKC++接口游戏在集成时,SDK直接向游戏游戏提供源码编译,因此需要使用NDK完成编译。在编译和环境配置过程中经常会遇到一些问题,在此总结一下。...ADT 配置(支持native编译) 使用ADT自带Android Tools 完成配置(推荐): ADT中已经整合了关于CDT编译相关内容。...在Builder中手动增加native支持 对于不是使用ADT环境,或者其他原因无法使用上面的方法配置。也可以直接手动去配置natave编译。...解决ADT在native编译报错“Unresolved inclusion jni.h” 开发过程中有时候会遇到其无法处理inclusion导致symbol显示错误,出现类似“Unresolved inclusion

78880

研读《程序员自我修养—链接、装载与库》

正文 机器指令 最初机器指令,是使用纸带来记录; 当变更指令时候,需要程序员重新计算每个子程序跳转地址。这个操作就是定位。 但是,如果有多条纸带,跳转更为复杂。...链接包括:地址和空间分配、符号决议和定位。...位置信息,并把所有的符号定义以及引用收集起来,放到全局符号表中; 通过所有段长度,计算和合并后长度和位置,并建立映射关系; 2、符号解析和定位使用上一步收集到信息,读取文件中段数据和定位信息...,进行符号解析和定位; .lib、.a是常见静态链接库; 静态库缺点: 浪费内存和磁盘空间、更新困难; 动态链接 动态链接:把链接过程推迟到运行时再进行。...它要解决其他共享对象依赖问题,不能依赖其他共享对象; 外部符号:在本目标文件引用但没有定义符号;(External Symbol) 当多个同名符号冲突时候,先装入符号优先,这种优先级方式成为装载序列

1.5K70

动态链接步骤与实现

在编写动态链接器时必须保证不使用任何系统库,运行库;对于第二个条件,动态链接器必须在启动时有一段非常精巧代码可以完成这项艰巨工作而同时又不能使用全局和静态变量。...通过“.dynamic”信息,自举代码便可以获得动态链接器本身定位表和符号表等,从而得到动态链接器本身定位入口,先将它们全部定位。...从这一步开始,动态链接器代码中才可以使用自己全局变量和静态变量。 实际上在动态链接器自举代码中,除了不可以使用全局变量和静态变量之外,甚至不能调用函数,即动态链接器本身函数也不能调用。...其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译共享对象,对于模块内部函数调用也是采用跟模块外部函数调用一样方式,即使用 GOT/PLT方式,所以在 GOT/PLT没有被定位之前...在前面介绍动态链接定位表时,我们已经碰到了几种定位类型,每种定位入口地址计算方法我们在这里就不再重复介绍了。

1.3K20

Linux命令(65)——ld命令

>,--mri-script=:为与MRI链接器兼容,ld接受由MRI命令语言编写脚本文件 --cref:创建跨引用表 -d,-dc,-dp:即使指定了可定位输出文件...=:从指定文件读取符号名称和地址 -r,--relocatable:生成可定位输出(称为部分连接) -rpath=:把指定目录添加到运行时库搜索路径 -rpath-link...size默认为1 -split-by-reloc[=count]:按照指定长度在输出文件中创建额外段 --section-start==:在输出文件中指定地址定位指定段...org>:使用指定地址作为bss段起始点 -t,--trace:在处理输入文件时显示它们名称 -u ,--undefined=:强制指定符号在输出文件中作为未定义符号...使用g++ -v命令可以查看最后一行collect2使用命令选项,进而了解生成可执行文所需相关依赖。

17.2K01

ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍

大意就是: IAR Assembler for Arm 是一个功能强大定位宏汇编程序,具有多种指令和表达式运算符。 汇编程序具有内置 C 语言预处理程序,并支持条件汇编。...两者都产生行业标准格式ELF中定位目标文件,包括DWARF调试信息格式。下图显示了编译过程: ilinkarm.exe   这个是 IAR 连接器。...库文件包含多个可定位 ELF 对象模块,每个模块都可以由链接器独立使用。 与直接指定给链接器对象模块相比,只有在需要时才包含库中每个模块。...类似于 GCC objdump,用于创建ELF可定位或可执行映像内容文本表示。...从可执行ELF目标文件创建可定位ELF目标文件。

8.5K34

mold源码阅读十一 relr and dynsym

或者全局变量,用于运行时定位来解析这些地址。...查到答案是 作为函数间接跳转入口: 所有函数,包括不需要定位函数,在第一次调用时都需要通过.got表来间接跳转。即使函数在链接时就已经获得了绝对地址,但仍需要通过.got表调用。...访问全局变量: 程序中所有全局变量,包括不需要定位变量,都需要通过基址寄存器加上.got中偏移量来访问。 即使变量值在链接时就已经确定,但程序仍需要通过.got表访问。...作为函数指针: 函数地址可以被用作函数指针。而所有的函数指针,包括指向不需要定位函数函数指针,都需要通过.got表来存取。...如果后续添加了需要定位符号,程序无需任何改动。 所以,总之,.got表中所有符号都是程序加载时解析。 即使符号不需要定位,但仍需要通过.got表间接存取。

26640

山东大学蒋妍彦教授课题组Journal of Nanobiotechnology:肿瘤微环境响应型芬顿纳米催化剂用于强化癌症治疗

CDT因其对细胞和特定亚生物体强氧化致死性,近年来引起了广泛关注;然而,肿瘤内芬顿反应效率不足以及不能连续产生H2O2等问题会极大限制CDT治疗效果。...近年来,研究者设计并开发了多种能够提升肿瘤内芬顿反应速率策略,这些增强策略引入也进一步推动了包含CDT多模态协同抗肿瘤治疗发展。...降低芬顿纳米催化剂对酸性环境依赖性也是加强CDT治疗效果另一要策略,芬顿纳米催化剂在体内催化速率较低另一原因便是部分具有芬顿或类芬顿效应金属离子在肿瘤微环境中会向惰性M(OH)x转变。...本文还讨论了使用外部能量(光和超声)多模式治疗与CDT单模式治疗效果之间差异;最后分析了化学动力学治疗过程中遇到挑战、芬顿纳米催化剂未来发展方向、以及一些可以早日促进CDT进入临床阶段建议...目前大家所认为芬顿纳米催化剂诱导癌细胞凋亡机制则是ROS氧化损伤,并在体外实验中得到了验证;但肿瘤微环境十分复杂,芬顿纳米催化剂在体内诱导癌细胞凋亡可能并不能简单利用这一原理进行解释。

78920

《程序员自我修养》第三章学习笔记

、运行平台、ABI版本、 ELF定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表位置和长度及段数量等。...3.4.3 定位表 1,一个叫”rel.text”段,类型是”SHT_REL”,就是定位表 2,链接器在处理目标文件时,需要对目标文件中某些部位进行定位(即代码段和数据段中那些对绝对地址引用位置...3,这些定位信息都记录在ELF文件定位表里。对于每个需要定位代码段或数据段,都会有一个相应定位表。...3.4.3 字符串表 1,把ELF文件中用到字符串(段名、变量名等)集中起来存放到一个表中。然后使用字符串在表中偏移来引用字符串。这个表就是字符串表。...3,强弱符号都是针对定义来说,不是针对符号引用。 假如 extern int ext; ext不是强符号也不是弱符号,因为它是一个外部变量引用。

1.1K60

PytorchC++端(libtorch)在Windows中使用

下文中使用代码和之前在Ubuntu中使用完全相同,我们不需要进行修改。 同样,首先,我们在官网下载适合于Windowslibtorch,因为稳定版出来了,所以我们可以直接拿来使用。..._1.lib;C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0/lib/x64/cudart_static.lib -- Found OpenCV...如果你电脑装有两个版本以上Visual Studio,那么这里要注意如果我们之前使用VS15编译的话那么就要使用VS15去打开这个文件,也就是之前编译使用工具和之后打开工程版本应该一致 打开后大概是这样子...Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files....Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

69440

ret2resolve学习笔记

依赖哪些共享对象,动态链接符号表位置,动态链接定位位置等等。是一个结构数组。 使用 readelf -d 查看 .dynamic section 中内容: ?...rel_offset 观察一下上图中反汇编代码,发现相邻两个需要定位函数 rel_offset 都是相差 8 。...其实 rel_offset 即为需要定位函数在 rel.plt 节中节偏移。r_info 这个结构是两个参数合在一起。...0x02 思路 多数动态装载器实现不去检查定位边界!!!所以我们在高地址处伪造 data 就可以。...跳过这段代码主要是修改 _dl_lookup_symbol_x() 函数参数,部分传参使用了寄存器,修改参数大概是 const struct r_found_version *version ,版本符号

86400

编译器、链接器和解释器

,比如:string 不能与 number 相加; 中间代码生成:在一些编译器中,源代码可能会被转换成中间代码,这是一种介于高级语言和底层机器代码之间表示形式。...每个文件都要确认两个事,自己有哪些符号可以供别的文件使用 和 引用别的文件符号真实存在。 链接器会从目标文件和库文件中提取这些符号,并建立符号表,记录每个符号名称和地址。...定位(Relocation): 目标文件和库文件通常会包含相对于文件起始位置相对地址,这些地址需要在最终可执行文件中被映射到正确内存地址上。...链接器会遍历目标文件中定位信息(.relo.text、.relo.data),将这些相对地址替换为实际绝对地址。这样,可执行文件就可以正确地在内存中加载和执行。 3....生成可执行文件(Executable File Generation): 在完成所有的符号解析、定位和库依赖解析后,链接器会根据上述步骤结果生成最终可执行文件。

28920
领券