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

动态链接过程延迟绑定的实现(PLT) 动态链接比静态链接要慢1%~5%,根据动态链接中PIC(与地址无关代码)的原理PIC,可以知道造成该情况的原因如下: 1.动态链接下对于全局和静态数据的访问都要进行复杂的GOT(全局偏移表)定位,然后间接寻址;对于模块间的调用也要先定位GOT,然后再进行跳转 2.动态链接的链接工作是在运行时完成,即程序开始运行时,动态链接器都要进行一次链接工作,而链接工作需要复杂的重定位等工作,减慢了启动速度 阅读详情

系列文章

【链接、装载与库】程序的编译过程
【链接、装载与库】动态链接相关结构
【链接、装载与库】动态链接初体验

前言

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

正文

首先创建5个文件liba.c、liba.h、libb.c、libb.h、main.c。
内容分别为:
liba.c

int funca(int i)
{
	return i + 1;
}

liba.h

#ifndef LIBA_H
#define LIBA_H

int funca(int i);

#endif

libb.c

int funcb(int i)
{
	return i + 2;
}

libb.h

#ifndef LIBB_H
#define LIBB_H

int funcb(int i);

#endif

main.c

#include <stdio.h>
#include "liba.h"
#include "libb.h"

int main()
{
	int a;
	int b;
	a = funca(1);
	b = funcb(1);

	printf("a is %d,  b is %d\n", a, b);
}

输入如下指令分别生成liba.so、libb.so两个动态共享对象:
gcc -fPIC -shared -o liba.so liba.c
gcc -fPIC -shared -o libb.so libb.c
然后输入如下指令对main.c进行编译输出可执行文件main:
gcc -o main main.c ./liba.so ./libb.so
此时文件夹中的内容如下:
在这里插入图片描述
运行可执行文件main得到如下结果:
在这里插入图片描述
接下来对可执行文件main进行分析。
输入如下指令得到main的反汇编代码:
objdump -S main
其中main函数部分内容如下:
在这里插入图片描述
可以看到
调用funca函数部分代码为callq 660 <funca@plt>
调用funcb函数部分代码为callq 680 <funcb@plt>
调用printf函数部分代码为callq 670 <printf@plt>
找到反汇编代码中0x660、0x670、0x680部分的代码,内容如下:
在这里插入图片描述
以funcb为例,可以看到调转到0x680地址后执行的代码为去0x200fd0地址取出一个数值,将其赋值给PC指针继续执行。
要想查看0x200fd0地址处的内容,输入如下指令,得到main的二进制形式:
objdump -s main
找到我们想要的内容如下:
在这里插入图片描述
这部分叫做全局偏移表(GOT)
可以看到0x200fd0地址处的内容为86060000 00000000进行大小端转换之后就是0x686,而0x686处的代码则是:
在这里插入图片描述
也就是压栈一个数值2,然后执行0x650处的代码,0x650处代码如下:
在这里插入图片描述
可以看到这部分执行的代码为压栈GOT表第二项数据,跳转到GOT表第三项存储的函数地址开始执行。
GOT表的内容如下:

序号地址含义
第一项0x200fa8.dynamic段地址
第二项0x200fb0Module ID (模块编号)
第三项0x200fb8_dl_runtime_resolve()
第四项0x200fc0funca函数
第五项0x200fc8printf函数
第六项0x200fd0funcb函数

调用_dl_runtime_resolve函数用于把funcb的真实地址填写到GOT中,整个过程如下:
在这里插入图片描述
这是第一次调用funcb函数的时候,之后再调用funcb函数时,由于GOT表已经写入了funcb函数的真实地址,所以执行过程如下:
在这里插入图片描述
这样就实现了第一次调用funcb函数时完成了动态链接,之后就可以直接调用的效果。

在调用_dl_runtime_resolve时要压入funcb函数的符号下标。
所谓的符号下标是.rela.plt段中的下标,输入如下指令:
readelf -a main
找到.rela.plt段的内容如下:
在这里插入图片描述
第一列表示函数在GOT表中的地址,最后一列表示函数的符号名。
_dl_runtime_resolve获取符号下标之后,就可以通过符号名去别的模块查找函数地址,找到之后将函数地址填写到第一列存储的GOT表地址中,也就完成了动态链接。

浅析ELF中的GOT与PLT 一、ELF简介 现在PC平台流行的可执行文件格式主要是Windows 下的PE(portable Executable) 和Linux的ELF(Excutable Linkable Format)。   编译器编译源代码后生成的文件叫做目标文件,从目标文件的结构上讲, 它是已经编译后的可执行文件格式,只是还没有链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就 阅读详情

相关推荐

【Linux学习笔记】Linux动态共享对象(动态链接库)装载过程

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

slvher的专栏 3109

ELF文件中的各个节区

ELF节区信息概述: 节区名 节区说明 备注 .rodata1 和rodata类似,只存放只读数据 .comment 存放编译器版本信息,如字符串 "GCC:(GNU)4.2.0" .debug 存放调试信息 .shstrtab ..

ashimida 8708

【MATLAB】绘制泽尼克多项式

上次只给了公式没有给代码,很多小伙伴表示不是很认可。今天直接把代码发上来了。

HPC_ZY 5577

动态链接1 程序员的自我修养第七章笔记

0. 序 预计这篇文章会很长,折腾了挺长时间才差不多捋清楚,主要书上一些地方和现在的实现有一点出入。 1. 概览 与动态链接有关系的节大概有这样一些,.interp, .dynamic, .gnu.hash, .rela.dyn, .rela.plt, .plt, .plt.got, .got, .got.plt。其中.rela.dyn和.rela.plt也可能替换为.rel.dyn, .rel.plt,取决于具体重定位类型的选择。 其中.interp, .dynamic提供动态链接的一些初始信息。 .gn

passenger12234的博客 934

联想拯救者恢复出厂设置全攻略

通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。

mmoo_python的博客 3252

DRAM自测试模块

1 背景技术DDR3/4 SDRAM属于高速外设,最高时钟频率可达到1600MHz,最高速率可达3200MT/s。在存储控制器与DDR34 SDRAM设备之间有一层专为高速接口设计的模拟电路,此电路对于前端设计人员来说,不管在模拟验证阶段和回片测试阶段,都是一个黑盒子。而对于后端测试人员来说若此部分为外购IP,则内部结构也是无法清楚了解的。所以在测试阶段,对于DDR34 SDRAM的测试就具有一定的

Hierro的DDR世界 7014

PLT延迟绑定技术

动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器要先进行一次链接工作。 由于程序模块之间包含了大量的函数引用,所以在程序开始执行之前,动态链接会耗费不少时间用于解决模块之间的函数引用的符号查找以及重定位。 由于程序的局部性原理,在一个程序的运行的过程中,往往不是所有的函数都能用到,相反在大量的符号中,只有少部分会用到,所以如果在程序一开始的时候就把所有的函数都链接好然而最后又没有用到,这很明显是一种浪费,所以就出现的延迟绑定的概念。 基本思想就是:函数不是程序运行之前就全部进行链接工作,而是在用

、moddemod 980

SpringBoot项目整合达梦数据库(MYSQL 转换 达梦数据库)

注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4。3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL。服务器配置又该有两种方式:①DM控制台工具修改;MYSQL的数据表转换成DM的数据表时,点击转换按钮。在这里操作:MYSQL数据库迁移至DM数据库。

m0_74824635的博客 2013

4. 深入窥探动态链接

在动态链接方式实现以前,普遍采用静态链接的方式来生成可执行文件。如果一个程序使用了外部的库函数,那么整个库都会被直接编译到可执行文件中。ELF 支持动态链接,这在处理共享库的时候就会非常高效。当一个程序被加载进内存时,动态链接器会把需要的共享库加载并绑定到该进程的地址空间中。随后在调用某个函数时,对该函数地址进行解析,以达到对该函数调用的目的。(1)简介: 过程连接表,在程序中以 .plt 节表示,该表处于代码段,每一个表项表示了一个与要重定位的函数相关的若干条指令,每个表项长度为 16 个字节,存储的是

谢谢大家的关注 895

PX4无人机实战:手把手教你用MAVROS实现Offboard模式(附避坑指南)

本文提供了一份详尽的PX4无人机Offboard模式实战指南,重点解析了如何通过MAVROS实现从仿真到实机的控制。内容涵盖硬件连接、串口权限设置、MAVROS配置、核心代码编写以及实机操作全流程,并附有详细的避坑指南和故障排查手册,帮助开发者快速掌握ROS与PX4飞控的集成开发。

weixin_29172201的博客 267

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 229

聊一聊Linux动态链接和GOT、PLT

共享动态库是现代系统的一个重要组成部分,大家肯定都不陌生,但是通常对背后的一些细节上的实现机制了解得不够深入。当然,网上有很多关于这方面的文章。希望这篇文章能够以一种与其他文章不同的角度呈现,可以对你产生一点启发。关于动态链接与静态链接,看到过这么与一个比方:如果我的文章引用了别人的一部分文字,在我发布文章的时候把别人的段落复制到我的文章里面就属于静态连接,而做一个超链接让你们自己去看就属于动态链接。

lcmsir的博客 638

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。

智慧空间实验室 3753

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

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

阿正的梦工坊 1470

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Linux库制作与原理进阶】从 ELF 装载到延迟绑定:搞懂动态库、GOT 与 PLT

本文围绕 ELF 装载与动态链接展开,讲清 Program Header Table 如何指导 Segment 映射,动态库如何进入进程地址空间,以及 PIC、GOT、PLT 分别解决什么问题。通过首次调用与后续调用的对比,进一步理解符号解析、地址重定位和延迟绑定的完整过程。

2402_87731470的博客 4104

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

yelvens的博客 6610

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

程序的动态链接(3):延迟绑定

概述 动态链接将链接工作由编译时推迟到了运行时,在每次程序运行时,动态链接器都要寻找并加载依赖的动态库,然后进行符号查找和重定位工作,这导致动态链接的程序在加载时会带来一些额外的开销。为了提升程序的加载速度,编译系统使用了一种称为延迟绑定(Lazy Binding)的技术。 延迟绑定实现 使用延迟绑定是基于这样一个前提:在动态链接下,程序加载的模块中包含了大量的函数调用,因此动态链接器会耗费很多的时间用于解决模块之间的函数引用的符号查找以及重定位,而实际上只有很少的一部分符号会被立刻访问。延迟绑定通过将函数

Aspiresky的专栏 3380

Linux x86_64 程序动态链接之GOT 和 PLT

Linux x86_64 程序动态链接之 GOT 和 PLT延时绑定技术,以及给出了一个demo。

小立仔 1671

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

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

多丰富下自己呀 6461

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

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

Yang_137476932的博客 3793

【链接装载与库】动态链接(下)

动态链接的确有很多优势,比静态链接要灵活得多,但它是以牺牲一部分性能为代价的。主要原因是动态链接下对于全局和静态的数据访问都要进行复杂的GOT定位,然后间接寻址;对于模块间的调用也要先定位GOT, 然后再进行间接跳转,另外一个原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作。我们将在这一节介绍优化动态链接性能的一些方法。在动态链接下,程序模块之间包含了大量的函数引用,会耗费不少时间用于解决模块之间的函数引用的符号查找以及重定位。

qq_60755751的博客 332

程序员的自我修养--链接、装载与库笔记:动态链接

1. 为什么要动态链接 静态链接诸多缺点,比如浪费内存和磁盘空间、模块更新困难等。 内存和磁盘空间:静态链接的方式对于计算机内存和磁盘的空间浪费非常严重,特别是在多进程操作系统情况下。 程序开发和发布:空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。一旦程序中有任何模块更新,整个程序就要重新链接、发布给用户。如果程序都使用静态链接,那么通过网络来更...

网络资源是无限的 3297

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

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

Chris_zhangrx的博客 810

一篇长文带你深析Linux动态链接的全过程

引言:最近受到了一位老师的启发(我不是CS专业的,我去找了信院里的操作系统的老师),又给我本狭隘的视野开拓了一些目光所及之处,交流了两个小时,倍感遗憾怎么没有早点认识这个老师,也倍感欣慰终于遇到了这种老师。 这篇文章可能有点晦涩难懂,我希望你有以下的前置基础知识(基础即可,我会尽量说清): 操作系统(最好看过CSAPP) AT&T语法的汇编语言(Intel汇编也可以,但是可能有些地方不同得去查询指令集开发手册了) 对C和C++有一定的掌握 对Linux操作熟练,对Linux内核和系统有一定的了解

遇事不决,问春风 4482

动态链接介绍

模块间的访问比模块内部稍微麻烦一点,因为模块间的数据访问目标地址要等到装载时才决定,我们前面提到要使得代码地址无关,基本的思想就是把跟地址相关的部分放到数据段里面,很明显,这些其他模块的全局变量的地址是跟模块装载地址有关的。如此循环直到所有依赖的共享对象都被装载进来为止,当然链接器可以有不同的装载顺序,如果我们把依赖关系看作一个图的话,那么这个装载过程就是一个图的遍历过程,链接器可能会使用深度优先或者广度优先或者其他的顺序来遍历整个图,这取决于链接器,比较常见的算法一般都是广度优先的。

biu801的博客 1339
上一篇: 【链接、装载与库】程序的编译过程
下一篇: 【LwIP源码学习1】LwIP网络接口管理
inputA
博客等级 码龄7年 297粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值