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

动态链接后ELFSection Name

背景 在So动态链接后,读取ELF文件,发现无法读取Section Header名称列表。即,无法在EShdr根据e_shstrndx找到Section对应名字。...而在运行时候动态链接是根据Segment来加载So文件,原因是希望尽可能小使用内存页面,并且提升加载速度。 ?...ELF链接与执行时视图 于是查看程序头部分,发现LOAD类型,仅仅只有.dynstr这个字符串表会被加载到内存。 ?...程序头 也就是说: 在So动态链接到内存时,.shstrtab和.strtab这两个Table是并没有加载到内存。ld仅仅只会加载.dynstr这个Table就够用了。...shstrtab 结论 shstrtab与strtab这两个表仅仅只是链接后保存在So文件,而在链接之后执行视图层面,这两个字符串表不会被加载到内存

1.3K30

动态链接相关结构

当所有动态链接工作完成以后,动态链接器会将控制权转交到可执行文件入口地址,程序开始正式执行 1. ".interp"段 那么系统哪个才是动态链接器呢,它位置由谁决定?...在LINUX系统,/lib/ld-linux.so.2通常是一个软链接,比如在我机器,它指向/lib/ld-linux.so.2,这个才是真正动态链接器,在linux,操作系统在对可执行文件所需要相应动态连接器...当系统Glibc库更新或者安装其他版本时候,/lib/ld-linux.so.2 这个软链接就会指向新动态链接器,而可执行文件本身不需要修改 ".interp" 动态链接器路径来适应系统升级...很多时候动态链接模块同时拥有“.dynsym” 和 ".sysmtab"往往保存了所有符号,包括 “.dynsym” 符号 与 “.sysmtab” 类似, 动态符号表也需要一些辅助表,比如用于保存符号名字符串表...但是在动态链接,导入符号地址在运行时才确定,所以需要在运行时将这些导入符号引用修正,即需要重定位; 我们在前面地址无关章节也提到过,动态链接可执行文件使用是PIC方法,但这不能改变它需要重定位本质

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

Unity与 SO 交互 ☀️| .so文件(动态链接库 ) 基础知识科普

前言 因为最近用到了so文件相关内容 所以来学习一下.so文件相关知识,正好来写博客也当是记录并分享一些知识 最终目的是在Unity与so文件进行交互处理,但是本篇文章需要先对so文件有一个基本认识...so文件特点 so文件与dll文件类似 so文件就是常说动态链接库,都是C或者C++编译出来 Linux下so文件时不能直接运行,一般来讲,.so文件称为共享库。...动态链接 这里有个程序源文件test.c与 动态库 libtest.so 链接生成执行文件 test: 命令: gcc test.c -L....-ltest -o test 命令: ldd test执行test,可以看到它是如何调用动态函数。 ---- ????...总结 本章节对so文件只是做了一个简单概述 后面文章开始介绍一下 怎样生成一个so文件 和 怎样在Android和Unity调用这个so文件进行交互 使用

1.5K40

如何识别IDA反汇编动态链接函数

在使用IDA静态反汇编时,如果正在逆向文件中有动态链接库函数(比如调用了程序自定义so库函数),IDA只会显示一个地址,跟进去会发现是延迟绑定关于plt代码,无法知道具体调用了哪个函数,对于逆向起来很是麻烦...按道理讲,虽然不能动态调试,静态分析不能看到运行时绑定地址,但是具体动态链接过程一定也是根据文件信息,所以静态也一定可以知道调用是哪个函数,但是我没有发现如何使用IDA自动确定(如有高手麻烦留言告诉我...),于是通过查阅《程序员自我修养》动态链接相关内容,找到了识别动态链接函数方法。...ELF文件还存储了needed动态链接库,IDA写在了该文件最开始,向上拉窗口可以看到,我们只要从这些so库找识别出函数名即可。...使用 grep -rn “函数名” 即可找到调用哪个库哪个函数。 ? 此外,还有这种形式动态链接调用,再次挖坑做以记录碰到再研究。

3.1K70

CC++动态链接创建和调用

多个应用程序可同时访问内存单个DLL 副本内容。DLL 是一个包含可由多个程序同时使用代码和数据库。下面为你介绍C/C++动态链接创建和调用。...动态连接库创建步骤: 创建Dll有两种方式。...二、用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程DllDemo.h文件。...动态链接调用步骤: 一、隐式调用 1、建立DllCnslTest工程 2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在目录 3、在DllCnslTest.h...动态链接提供了一种方法,使进程可以调用不属于其可执行代码函数。通过使用 DLL,程序可以实现模块化,由相对独立组件组成。希望通过本文分析,你会对此有了解。 实例源码

1.5K100

Linux下HOOK动态链接API方法

我最开始想法是找一个Linux下Detours库,于是找到了subhook。其原理是:修改被Hook函数起始地址处汇编代码,让执行流程跳到我们定义函数。...我使用work账户登录,其真实uid是502。而我们重写了程序getuid,则返回是我们“指定”800。         如果我们希望在被hook函数调用原始函数,怎么做呢?...可以想象libcgetuid对应符号不会因为我们程序而被改变,那么就意味着程序运行,将有两个getuid。事实也的确如此。        ...第一个getuid就是我们重定义hook函数体,第二个是动态链接库libc.so。...这种方式就提供了一种针对动态链接函数替换功能。

4.3K20

动态链接步骤与实现

动态链接自举 我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,它重定位工作由动态链接器来完成。...从这一步开始,动态链接器代码才可以使用自己全局变量和静态变量。 实际上在动态链接自举代码,除了不可以使用全局变量和静态变量之外,甚至不能调用函数,即动态链接器本身函数也不能调用。...当一个新共享对象被装载进来时候,它符号表会被合并到全局符号表,所以当所有的共享对象都被装载进来时候,全局符号表里面将包含进程所有动态链接所需要符号。...重定位完成之后,如果某个共享对象有“.init”段,那么动态链接器会执行“.init”段代码,用以实现共享对象特有的初始化过程,比如最常见,共享对象C++ 全局静态对象构造就需要通过“init...关于动态链接器本身细节实现虽然不再展开,但是作为一个非常有特点,也很特殊共享对象,关于动态链接实现几个问题还是很值得思考: 动态链接器本身是动态链接还是静态链接?

1.3K20

cmake:动态链接库(so)静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

tcmalloc.a也可以以静态链接方式加入应用程序,大概因为使用太方便,网上关于这方面的介绍都是一笔带过,但是如果要在动态 库(so)静态编译tcmalloc,却是有所不同。...我项目中有一个so动态库,需要在java通过jni调用,因为涉及频繁内存分配操作所以这个so希望用tcmalloc管理内存池以提高系统运行效率,如果使用以动态库方式使用tcmalloc。...这样以来,不仅是我so库,整java程序在运行过程所有向操作系统申请释放内存过程都交给了tcmalloc管理了,其实挺好。...于是我觉得用静态链接方式将tcmalloc编译到so库中比较好,这样这个动态库以比较独立方式发行,不再依赖系统是否安装了tcmalloc和libunwind。...总结 如果在可执行程序静态链接tcmalloc时,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态库(so)静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

1.8K10

静态链接库和动态链接区别

动态库而言:某个程序在运行要调用某个动态链接库函数时候,操作系统首先会查看所有正在运行程序,看在内存里是否已有此库函数拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。...4、动态链接库(显式链接)4.1、重要dlfcn.h头文件LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接函数原型。下面详细说明一下这些函数。...函数功能Windows下Linux下打开加载动态链接库LoadLibrarydlopen获取动态链接函数地址GetProcAddressdlsym关闭动态链接库FreeLibrarydlclose...-lmymath链接静态库可执行程序明显比链接动态可执行文件大。6、查看库符号1、使用nm命令可以打印出库涉及到所有符号。...库既可以是静态库也可以是动态常见三种符号:①在库中被调用,但没有在库定义(表明需要其他库支持),用U表示②在库定义函数,用T表示③“弱态”符号,他们虽然在库中被定义但是可能被其他库同名符号覆盖

7.9K21

MacOS平台下@rpath在动态链接应用

对于XCodeinstall name项也没有进行过多配置,于是生成动态库文件在应用到各个产品时都要修改install name才能用。...在动态基本上不使用这个path.        (2) @loader_path。这个path在之前应用中用非常多,可以通过这个path来设置动态install path name。...此外,run path是可以设置多个值,这样看来就和Windows下PATH变量差不多了。run path指定多个值就可可以完美解决掉参考链接问题了。...三、使用方法  (1)在XCode设置   在编译动态链接库文件(*.dylib)时,应当将install name设置为@rpath/library.dylib。 ?  ...@rpath/libinsvmedia.dylib    这样也能在链接阶段对动态链接install name进行修改。

4K100

Linux动态链接使用

动态链接库与普通程序相比而言,没有main函数,是一系列函数实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。...例如下面实现一个简单整数四则运输动态链接库,定义caculate.h和caculate.c两个文件,生产libcac.so动态链接库。...readelf -a smu.o 将二进制文件转换为汇编 objdump -d sum.o 动态链接生成 sum.c #include #include <stdlib.h...,需要在.o文件生成时加参数-fPIC gcc -c sum.c -fPIC -o sum.o gcc sum.o -o shared sum.so 一般,共享库编译命令为(曾经实验) 动态链接库...sum.so => not found 这时候需要 export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH 注意:-fPIC是生成.o时使用,-shared是用来生成动态链接

4.7K10

浅谈Linux动态链接

经过链接之后,那些第三方库定义函数就能被调用执行了。早期一些操作系统一般使用静态链接方式,现在基本上都在使用动态链接方式。...静态链接动态链接 虽然静态链接动态链接都能生成可执行文件,但两者代价差异很大。下面这张图可以很形象地演示了动态链接和静态链接区别: ?...而动态链接链接时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库某些函数时,再从这些第三方库读取自己所需方法。...地址无关 无论何种操作系统上,使用动态链接生成目标文件凡是涉及第三方库函数调用都是地址无关。...动态链接优缺点 相比之下,动态链接主要有以下好处: 多个可执行文件可以共享使用系统共享库。每个可执行文件都更小,占用磁盘空间也相对比较小。

8.7K30

Linux链接文件_软链接和硬链接

一、链接文件介绍 Linux操作系统链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode信息到块领域将数据取出来。...二、两者区别 硬链接记录是目标的inode,软链接记录是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区链接,而硬链接由于inode缘故,只能在本分区链接。...注:上例du命令用来计算文件或者目录大小,-k表示以KB为单位,这里4,就指的是4KB;ll命令等同于 ls -l。...在上例,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接另外一个限制——不允许目录做硬链接。例: ?

6.5K30

Linux链接文件_软链接和硬链接

一、链接文件介绍 Linux操作系统链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接本质区别在于inode。...以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode信息到块领域将数据取出来。...二、两者区别 硬链接记录是目标的inode,软链接记录是目标的路径。 软链接就像是快捷方式,而硬链接就像是备份。 软链接可以做跨分区链接,而硬链接由于inode缘故,只能在本分区链接。...注:上例du命令用来计算文件或者目录大小,-k表示以KB为单位,这里4,就指的是4KB;ll命令等同于 ls -l。...在上例,删除源文件passwd后,文件大小依旧没有改变。说明硬链接文件并不会复制数据块额外占用磁盘空间。 再看硬链接另外一个限制——不允许目录做硬链接。例: ?

6.8K30

【100个 Unity实用技能】 | Unity 在代码 动态改变RectTransform位置及宽高 方法整理

Unity 小科普 老规矩,先介绍一下 Unity 科普小知识: Unity是 实时3D互动内容创作和运营平台 。...包括游戏开发、美术、建筑、汽车设计、影视在内所有创作者,借助 Unity 将创意变成现实。...Unity 平台提供一整套完善软件解决方案,可用于创作、运营和变现任何实时互动2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。...---- Unity 实用小技能学习 Unity 在代码 动态改变RectTransform位置及宽高 方法整理 RectTransform官网API地址:https://docs.unity3d.com.../2020.3/Documentation/ScriptReference/RectTransform.html 今天来讲一下代码动态改变RectTransform大小及宽高方法,关于RectTransform

1.7K30

NDK--Android Studio配置FFmpeg动态链接

上次将FFmpeg通过linux系统编译成了arm平台下动态链接库,生成了一个文件夹: 其中include存放着头文件,lib存放着so库,今天将这些内容导入AS,用于接下来音视频开发。...1.首先新建ndk工程,并在工程main文件夹中新建jniLibs文件夹(AS默认so库存放路径),并将上图中文件夹复制到jniLibs文件夹下 armeabi存放so库 include存放头文件.../jniLibs) 设置include路径 include_directories (${my_lib_path}/include) 添加so库 #将第三方库作为动态库引用 add_library(avcodec...IMPORTED_LOCATION ${my_lib_path}/${ANDROID_ABI}/libavcodec-56.so) 最后不要忘记连接到生成so target_link_libraries...IMPORTED_LOCATION ${my_lib_path}/${ANDROID_ABI}/libavcodec-56.so) #将第三方库作为动态库引用 add_library

1.1K20

Linux链接与软链接

inode号,它们名字不一定相同,但只要inode号一样就行,它们最终都链接到一个文件里,这就是硬链接。...也就是说,当文件链接数被目录记录了一次,文件链接数就增加了一次。所以,文件只要在目录里存在,它就至少有一个硬链接。...(因为引入了对目录硬连接就有可能在目录引入循环,在目录遍历时候系统就会陷入无限循环当中,这样导致无法定位到访问目录)     目录链接数包含目录自身名字,以及.和子目录里.. 791422...=(链接数-2) 软连接(符号链接):软连接是一个文件,只不过文件里存放是别的文件路径,软连接是一个单独文件,软连接可以通过路径访问源,如果源没了,软连接开始闪烁,找不到源, 软链接创建方式  ln...软连接: 软链接又称之为符号连接。软链接文件类似于Windows快捷方式。它实际上是一个特殊文件。在符号连接,文件实际上是一个文本文件,其中包含有另一文件位置信息。

4.2K10

unity shaders】:UnityShader及其基本框架

UnityShader三种基本类型 按照渲染管线分类,可以把Sharder分成3个类别: 固定功能着色器(Fixed Function Shader) 固定功能着色器为固定功能渲染管线具体表现。...表面着色器 存在于Unity3D由U3D发扬光大一门技术。Untiy3D为我们把Shader复杂性包装起来,降低shader书写门槛。...UnityShader基本框架 UnityShader整体框架写法可以用如下形式来概括: Shader "name" { [Properties] SubShaders[Fallback]...} Unity中所有着色器都由关键字shader开始,随后字符表示着色器名字,这个名字会显示在Inspector检视面板,所有的代码都应该放在{}里面。...shader整体框架 如上面的整体框架,我们可以画出下面这图: 从这幅图可以看到,Unityshader可以分为以下三个模块: 属性Properties Properties一般定义着色器起始部分

1.6K20

【图片+代码】:Linux 动态链接过程【重定位】底层原理

在上一篇文章,我们一起学习了Linux系统 GCC编译器在编译可执行程序时,静态链接过程是如何进行符号重定位。 为了完整性,我们这篇文章来一起探索一下:动态链接过程是如何进行符号重定位。...示例代码 我们需要3个源文件来讨论动态链接重定位过程:main.c、a.c、b.c,其中a.c和b.c被编译成动态库,然后main.c与这两个动态库一起动态链接成可执行程序。...但是对于动态链接程序来说,在执行入口函数指令之前,必须把该程序所依赖动态库加载到内存,然后才能开始执行。...但是动态链接过程重定位,与静态链接处理方式差别就大很多了,因为每个符号地址只有在运行时候才能知道它们地址。...也就是说:动态链接器知道每个动态代码段、数据段被加载内存地址,因此动态链接器也会维护一个全局符号表,其中存放着每一个动态库中导出符号以及它们内存地址信息。

1.8K11

C++又一坑:动态链接全局变量

原先这个静态模块静态全局变量是有构造函数,也就是构造函数干了点事情。 我们都知道,程序载入在进入主函数前会依次初始化全部全局和静态变量。载入动态链接库时也不例外。...这时候矛盾就来了,二进制b在进入主函数前会初始化模块a全局变量,执行构造函数;然而载入动态链接库c时,也会启动对c内全局变量进行初始化,也会执行同一个对象构造函数。...,在Linux多个动态链接库和主程序引用同一个全局变量(地址相同),但是每一个二进制实例都会完成一次构造。...虽然每个动态链接库和主程序引用同一个全局变量也各自都执行了一次构造。...这也就意味着,在Linux,载入动态链接库实际上可以直接使用外部框架或者其他模块全局数据,但是在Windows下确是隔离,不能直接访问到。

6K30
领券