【链接、装载与库】动态链接相关结构

动态链接——GOT和PLT 动态链接,地址无关代码,GOT表和PLT表 阅读详情

前言

本文对动态链接中比较重要的几个段进行分析。

正文

“.interp”段

Linux系统在执行一个可执行文件之前,要先启动动态链接器对其完成一些动态链接相关工作,动态链接器的路径则在.interp段中,以【链接、装载与库】动态链接初体验一文中的例子为分析对象。
输入如下指令:

objdump -s Program1

objdump用于查看可执行文件或目标文件的内容结构,-s表示打印出目标文件的所有内容
在这里插入图片描述
对Program1打印的结果中,.interp段内容如下:
在这里插入图片描述
可以看到其内容是一段字符串,表示动态链接器的路径
/lib64/ld-linux-x86-64.so.2.
通过./Program1指令运行Program1时,会首先启动该动态链接器完成动态链接。

“.dynamic”段

这个段保存了动态链接器在进行动态链接时所需要的基本信息,如依赖哪些共享对象、动态链接符号表的位置等。
继续对Program1可执行文件进行分析,输入如下指令:

readelf -d Program1

即可打印Program1的".dynamic"段,打印内容如下:
在这里插入图片描述
内容含义如下
在这里插入图片描述

其中的

0x0000000000000001 (NEEDED) 共享库:[./Lib.so]

表示用到了在【链接、装载与库】动态链接初体验中生成的共享对象Lib.so
在这里插入图片描述

0x0000000000000005 (STRTAB) 0x470
0x0000000000000006 (SYMTAB) 0x3c8

表示动态链接符号表的地址为(.dynsym)为0x470,动态链接字符串表(.dynstr)的地址为0x3c8
查看objdump -s Program1打印的内容
在这里插入图片描述

.dynsym段和.dynstr段的起始地址都可以对应上。

动态链接符号表

Program1用到了Lib.so中的foobar()函数,foobar()是Program1的导入函数,foobar()是Lib.so的导出函数。
表示动态链接这些模块之间导入导出关系的表叫做动态符号表,“.dynsym”。
存放动态链接相关符号名的字符串表叫做动态符号字符串表,“.dynstr”。
以Lib.so为例,输入如下指令:

objdump -s Lib.so

打印Lib.so的二进制内容,其中
.dynsym段内容为:
在这里插入图片描述
.dynstr段内容为:
在这里插入图片描述
可以看到.dynstr段中包含字符串foobar,导出函数。
.dynsym段二进制内容不容易看,可以输入以下指令:

readelf -s Lib.so

可以看到输出.dynsym段内容如下:
在这里插入图片描述
其中第7行用于表示foobar
其中的1119表示函数的起始地址,40表示该函数的长度。
输入如下指令得到Lib.so的反汇编内容:

objdump -S Lib2.so

其中foobar函数部分为:
在这里插入图片描述
刚好可以对应上。

【Linux学习笔记】Linux动态共享对象(动态链接库)装载过程 之前开发项目时,曾遇到一个问题:模块中用到的某so文件与模块某源码文件中存在同名函数(在链接器linker来看,是同名符号)时,so文件中同名函数被“覆盖”,从而导致模块启动时崩溃。当时曾专门做过实验,得到了避免出问题的一些小技巧(参见之前的某篇笔记),但其实对引发问题的底层原因并特别不清楚(当时由于这类问题对应的术语及其英文关键词一无所知,导致google不出干货)。最近,阅读《程序员的自我修养 阅读详情

相关推荐

《程序员的自我修养--链接,装载与库》

《程序员的自我修养--链接,装载与库》

zaizai1007的博客 1400

ELF中与动态链接相关的段

该段与 “.symtab”段类似,但只保存了与动态链接相关的符号,很多时候,ELF文件同时拥有 .symtab 与 .synsym段,其中 .symtab 将包含 .synsym 中的符号。该段是 .dynsym 段的辅助段,.dynstr 与 .dynsym 的关系,类比与 .symtab 与 .strtab 的关系。在动态链接下,需要在程序运行时查找符号,为了加快符号查找过程,增加了辅助的符号哈希表,功能与 .dynstr 类似。对函数引用的修正,其所修正的位置位于 “.got.plt”...

啊渊的专栏 1065

《程序员的自我修养--链接、装载与库》笔记

1.6.1 线程基础 一个进程通常由多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)及一些进程级的资源(如打开文件和信号)。经典的线程与进程的关系图: 线程中的访问权限 线程中的私有存储: 栈 线程局部存储(Thread Local Storage,TLS) 寄存器(包括PC寄存器) 从C的角度看: 1.6.2 线程安全 同步与锁 所谓同步,是指一个线程访问数据未结束时,其他线程不得对同一个数据进行访问。 同步最常用的方法是锁。 二元信号量: 最简单的一种锁,只有两种状态:占

AnChenliang_1002的博客 2396

so文件中重要的Section--符号表、字符串表、重定位表

转:https://blog.csdn.net/feglass/article/details/51469511 下面我们分析一些so文件中重要的Section,包括符号表、重定位表、GOT表等。 -符号表(.dynsym) 符号表包含用来定位、重定位程序中符号定义和引用的信息,简单的理解就是符号表记录了该文件中的所有符号,所谓的符号就是经过修饰了的函数名或者变量名,不同的编译器有不同的修饰规则。例如符号_ZL15global_static_a,就是由global_static_a变量名经过修饰而来。

zhangmiaoping23的专栏 8693

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

嵌入式STM32控制电梯面板

嵌入式STM32控制电梯面板 用点阵来显示电梯向上还是向下运动,用数码管来显示楼层数(由于灯阵显示楼层数比较困难故用数码管代替)。当按下对应的按钮,就可以去到对应层数,可上升可下降。 #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_it.h" #define uint unsigned int #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) #define

code_init_的博客 2111

ELF文件格式

ELF(Executable and Linking Format),即“可执行可连接格式”,最初由 UNIX系统实验室(UNIX System Laboratories – USL)做为应用程序二进制接口(Application Binary Interface - ABI)的一部分而制定和发布。

一木浅雪的博客 377

deepseek本地部署及应用部署指南

如果你找到的日志是[send] via NET/IB/0,则表示网络通信是通过IB网络的,但是没有开启GDRDMA技术,则会有大致5%的性能损耗(网传,未实测)。新增的环境变量配置,主要用于启用IB网络通信,而非使用以太网进行通信,详细的每一个参数的具体含义,可以在英伟达NCCL的官方网站上找到说明。下一步,我会对已经完成部署的模型进行压测,来探索系统的性能极限在哪里,以及如何在生产环境中何如进行进一步的性能优化,期待你的关注。

weixin_39797121的博客 2624

Android逆向之旅---基于对so中的函数加密技术实现so加固

一、前言今天我们继续来介绍so加固方式,在前面一篇文章中我们介绍了对so中指定的段(section)进行加密来实现对so加固http://blog.csdn.net/jiangwei0910410003/article/details/49962173这篇文章我们延续之前的这篇文章来介绍一下如何对函数进行加密来实现加固,当然这篇文章和前篇文章有很多类似的地方,这里就不做太多的解释了,所以还请阅...

weixin_30384217的博客 484

在CoppeliaSim里实现一个最简单的强化学习

前言 上一篇文章中介绍了CoppeliaSim的一些基本知识和一个简单的用python去控制CoppeliaSim里面四旋翼无人机运动的一个例子。文章链接 :https://blog.csdn.net/qq_37051669/article/details/115324851 本文将继续介绍如何利用CoppeliaSim的物理环境去实现一个最简单的强化学习。 如何实现强化学习 强化学习(Reinforcementlearning)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利.

qq_37051669的博客 3765

基于STM32的INA226电压电流检测仪

该功率检测装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。系统包括按键、LED指示灯、OLED屏幕、INA226电压电流检测、复位电路、晶振电路、蜂鸣器驱动、输入输出接口、调试接口和3.3V降压电路等模块。微控制器通过按键检测用户输入,启动功率检测,采集数据并通过OLED显示,异常情况触发蜂鸣器报警,LED状态指示同步反馈。3.3V降压电路为所有模块提供稳定电源,晶振电路确保时序精度。INA226芯片通过I2C接口与微控制器通信,实

a2784288164的博客 1910

动态链接中的PLT和GOT原理

操作系统通常使用动态链接的方法来提高程序运行的效率。在动态链接的情况下,程序加载的时候并不会把链接库中所有函数都一起加载进来。 而是程序执行的时候按需加载,如果有函数并没有被调用,那么它就不会在程序生命中被加载进来。 这样的设计就能提高程序运行的流畅度,也减少了内存空间。plt/got在其中就起到了重要作用,起到了映射作用。

Roy1986613的博客 1864

【EB-03】 AUTOSAR builder与EB RTE集成

打开EB工具后,在EB的步骤是:执行MultiTask(2)-> Mapping Component to Partitions(4)->Task Mapping(5)-> SvcAs_Trigger(7)-> Code Generation(8)如涉及新增BSW Module,也需要重复以上步骤。

libuping2023的博客 960

《程序员的自我修养——链接、装载与库》读书笔记—— 7.5 动态链接相关结构

7.5.x 这几小节看的有点懵,只能多看几遍,慢慢理解。定几个小目标: 搞清楚.dynamic, .dynsym, .rel.dyn, .rel.plt 这几个段都保存了哪些信息? 这些段能在什么阶段起到什么作用?

weixin_43512663的博客 892

如何在 Mac 上下载安装 Xcode——并为 iOS 开发更新它原文

下载 Xcode安装命令行工具打开新版本删除文件注意,我在下面的步骤中列出了一些终端命令。这些命令可以被输入到你现在的工作目录中。这意味着你不需要导航到任何特定的文件夹。如果你真的想这样做,你可以在输入下面的步骤中的命令之前先输入== cd==。这将使你返回到主文件夹。

专注于AI领域前沿知识,业余爱好开发软件 4667

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1480

《链接装载与库》第七章——动态链接

将程序的模块互相分割开,不让它们静态地链接在一起;即不对那些组成程序的目标文件进行链接,等到程序运行时再链接。有如Program1和Program2两个程序,并假定保留了Program1.o、Program2.o和Lib.o三个文件。当我们需要运行Program1这个程序时,系统首先加载 Program1.o,而系统发现Program1.o中用到了Lib.o,即Program1.o依赖于Lib.o,此时系统加载Lib.o,并将其加载至内存。所有需要的目标文件加载完毕后,若依赖关系满足,即所有的依赖文件都在磁

yelvens的博客 6610

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《程序员的自我修养:链接、装载与库》读书笔记:静态链接、动态链接

静态链接、动态链接,目标文件的内容

阿正的梦工坊 1470

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【读书笔记】【程序员的自我修养 -- 链接、装载与库(二)】进程虚拟地址空间、装载与动态链接、GOT、全局符号表、共享库的组织、DLL、C++与动态链接

进程虚拟地址空间、装载与动态链接、GOT、全局符号表、共享库的组织、DLL、C++与动态链接

多丰富下自己呀 6461

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

链接、装载与库:动态链接

简介        本篇整理了动态链接相关的原理、整个链接和装载的过程。 为什么要动态链接        1. 静态链接的方式对于内存和磁盘空间浪费严重。例如,使用静态链接的每一个C程序都将自己保留一份C静态库。        2. 使用静态链接方式的程序一旦有任何模块的更新或微小的改动,都需要整个程序重新编译链接以及发布。 动态链接

时间文盲的记事板 1107

装载与动态链接——动态链接(二)

文章目录为什么要动态链接地址无关代码延迟绑定动态链接步骤与实现动态连接器自举装载共享对象重定位和初始化显式运行时链接 前文速递: 静态链接——编译和链接(一) 静态链接——目标文件(二) 静态链接——静态链接(三) 装载与动态链接——装载与进程(一) 本文主要是《程序员的自我修养》一书的内容摘要和梳理,如有需要并且没有被本文涵盖的内容,建议读者自行观看原书。 前面主要写了文章来介绍书中对程序的静态链接的相关内容,接下来系列开启对动态链接的学习。 为什么要动态链接 静态链接可以使程序开发者可以独立地开发和测试

Chris_zhangrx的博客 810

【免费下载】 程序员的自我修养—链接、装载与库

程序员的自我修养—链接、装载与库 【下载地址】程序员的自我修养链接装载与库 程序员的自我修养—链接、装载与库 项目地址: https://gitcode.com/Open-source-documentation-tutorial...

gitblog_06683的博客 1907

Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

Linux下的ELF文件、链接、加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行。链接可以执行与编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是被加载器加载到内存执行时;甚至执行于运行时,也就是由应用程序来执行。 ​ — CSAPP 本文主要参考[原创] Linux环境下:程序的链接, 装载和库,[完结] 2020 南京大学

weixin_44966641的博客 1万+

【链接、装载与库】动态链接中的延迟绑定(PLT)

动态链接是在运行时将各个模块的代码进行整合,静态链接是在编译时对各个模块的代码进行整合。而运行时整合使得动态链接相对消耗了一些性能,为了减小这点带来的影响,动态链接中引入了延迟绑定(PLT),其基本思想是当函数第一次被用到时才进行绑定(符号查找、重定位等),如果没有用到则不进行绑定,接下来通过一个示例对延迟绑定进行分析。

inputA的博客 1371

程序员的自我修养—链接、装载与库 笔记

程序员的自我修养—链接、装载与库 笔记目标文件静态链接编译和链接过程动态链接装载过程函数调用过程系统调用过程堆栈 目标文件 静态链接 编译和链接 过程 动态链接 装载 过程 函数调用过程 系统调用过程 堆栈 ...

Yang_137476932的博客 3793

链接、装载与库[7]动态链接

1.动态共享对象与动态链接库 在Linux系统中,ELF动态链接文件被称为动态共享对象(DSO, Dynamic Shared Object),一般以 .so 为扩展名; 在Windows中,动态链接文件被称为动态链接库DLL,以**.dll**为扩展名。 2.动态链接程序运行时地址空间分布 共享对象.so的最终装载地址在编译时时不确定的,而是在装载时,装载器根据当前地址空间的空闲情况,动态分配一块足够大小的虚拟地址空间给相应的共享对象。 可执行文件 往往是第一个被加载的文件,它可以选择一个固定空闲的

qq_43118572的博客 638
上一篇: 【链接、装载与库】动态链接初体验
下一篇: Xilinx SDK创建项目时报错“Error generating bsp sources. Please check the SDK Log view for further details.”
inputA
博客等级 码龄7年 297粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值