动态库问题

作者: 罗蓁蓁 | 来源:发表于2020-05-01 12:34 被阅读0次

问题现象

源码一样,使用diab工具链编译生成的dl库,可以加载动态库。但是使用gnu工具链编译生成的dl库,可以加载动态库。

问题修改

修改dl库里的load.c中的_rtld_load_got_pointer接口和_rtld_load_object接口。

rtld_load_got_pointer

修改如下:

[图片上传失败...(image-b06640-1588307653871)]

改为:

[图片上传失败...(image-8fb25b-1588307653872)]

rtld_load_object

修改如下:

[图片上传失败...(image-79ce12-1588307653872)]

改为:

[图片上传失败...(image-f040bc-1588307653872)]

问题分析

写了一个最简单的c文件:

[图片上传失败...(image-1948fb-1588307653872)]

分别使用vx工具链下的gnu和diab,以及linaro下的gnu工具链,以及裝发下自己编译生成的工具链编译生成.o过程文件,并使用objdump反汇编查看。只有vx工具链下的gnu会生成memset接口,如下:

[图片上传失败...(image-fc5218-1588307653872)]

而memcpy接口存在于c库,而没有存在于dl中。因此在生成rtp.vxe的时候,会因为找不到该接口,而认为该类似接口存在于动态库中,因为会跳转到PLT表查找该接口执行。而dl库此时还处于加载动态库到内存,并生成GLOBAL_OFFSET_TABLEPROCEDURE_LINKAGE_TABLE的过程中,因此会报错。

[图片上传失败...(image-f85146-1588307653872)]

解决方法

方法1

把需要gnu自动生成类似memcpy这种赋初值的地方,先不赋初值,而是在之后使用strcpy赋初值,因为,该接口在dl库中会在预处理时被替换为_rtld_strcpy,而gnu自动生成类似memcpy这种赋初值的地方,却不会被替换。

[图片上传失败...(image-802d83-1588307653872)]

而这些接口在dl库中是有实现的。

目前可以确认使用vx的GCC工具链对函数的局部变量(字符串,结构体)赋初值时,会使用memset来处理,而使用其它GNU工具链则是使用普通汇编指令完成变量在栈空间的初始化,不会出现调用C库接口的情况。

方法2

在生成dl库以后,使用objcopy对生成的dl进行替换memset为_rtld_memset.

这种方法更好,命名如下:

dcore-objcopy-arm --redefine-sym memcpy=_rtld_memcpy --redefine-sym memset=_rtld_memset libdl.a

出差必备

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP,点击注册

相关文章

  • 动态库与静态库相互连接

    动态库--动态库 场景:App --> 动态库A --> 动态库 B 存在问题:动态库B应该的路径 = 动态库A的...

  • dyld: Library not loaded解决方案

    此问题是由于动态库依赖路径导致,分为两种情况: 动态库文件本身路径问题。 动态库文件内部依赖路径问题。 1. 动态...

  • ios逆向 - fishhook 的原理分析

    一 知识预备 1: 静态库和动态库 我们自己写的代码,会调用很多外部的库,包括静态库,动态库 问题来了,动态库和静...

  • 动态库问题

    问题现象 源码一样,使用diab工具链编译生成的dl库,可以加载动态库。但是使用gnu工具链编译生成的dl库,可以...

  • Cmake 库依赖关系的传递

    问题描述 假设动态库B依赖动态库A,可执行程序C依赖动态库B。 如下图: 在linux平台下,按照正常来说,在编译...

  • MT MD 讲解

    (114条消息) 静态库、动态库、静态链接、动态链接、系统运行库混合、MD MT默认库冲突问题wxlfreewin...

  • 动态库上传(上架)APP STORE问题及解决思路

    主题 问题1:动态库包签名问题。问题2:动态库包含模拟器代码在接入方上传AppStore时出现无效的X86_64\...

  • 程序加载过程

    程序加载时,会加载静态库、动态库和二进制可执行文件等,由此引出几个问题:问题1❓:什么是静态库?什么是动态库?二者...

  • Fortran与C++交叉编程:Fortran如何调用C++动态

    Fortran程序中调用C++编写的动态库的问题分为两个子问题 Fortran调用c形式函数接口 为c++动态库编...

  • 4.2.2 如何实现构建动态链接库

    4.2.2 如何实现构建动态链接库问题一:如何实现构建动态链接库? 构建出动态链接库文件 构建输出的以下这四个文件...

网友评论

    本文标题:动态库问题

    本文链接:https://www.haomeiwen.com/subject/tnafghtx.html