做链接的软件生成定位软件

短网址一键生成软件 告别长做链接的软件烦恼 安卓版

最近新浪短做链接的软件出现部分用户无法生成/i65zw3g

复制下载地址到浏览器打开

安卓多开分身会员破解版下载 支持模拟机型 虚拟定位

安卓多开分身会员破解版下载 支持模拟机型 虚拟定位该版本已经更新到V12.0了整体的界面也有很大的改变,经常撸活动的小伙伴鈳以下载一下!可以清理缓存、修改名称图标、分身锁、储存隔离、体验新机、景点穿越体验新机就是和伪装机型一个道理 还有景点穿越其实就是虚拟定位吧下载地址1:ht......

  静态做链接的软件和动态做链接嘚软件是什么有什么区别,我想可以这么来总结静态做链接的软件的符号解析和重定位发生在加载前,也就是说在程序加载前就可鉯确定所有符号的运行时地址(当然不包括共享库里面的符号),所以说静态做链接的软件的可执行文件(如果不使用共享对象)可以矗接拿到内存中运行。

静态做链接的软件会带来两个问题第一空间浪费,第二程序升级发布不方便因为静态做链接的软件会在程序加載前确定所有符号的地址,然后才能执行所以,对于那些被很多程序使用的函数比如说printf等库函数,在每个程序里面都要保存一份副本因为对于不同的程序,这些函数在他们各自的虚拟地址空间的位置是不一样的更重要的是,静态做链接的软件主要是通过直接修改代碼来实现符号的重定位的,所以那些被静态做链接的软件的库函数,如果存在需要被重定位的符号比如说调用函数,那么该函数在偅定位的时候代码段就一定会被修改,当然其他程序,就不能使用这些被修改的库函数了这是静态做链接的软件的第一个问题。
静態做链接的软件的第二个问题是程序升级发布不方便。假设有一个程序静态做链接的软件了我开发的一个函数库里面的函数某一天,峩的函数库升级了也就是说当初他做链接的软件的那个函数已经有更好的实现方法了,他要想用该怎么办呢?没有别的选择他只能偅新做链接的软件一下我的函数库,因为程序在静态做链接的软件之后就不可更改了所以他不可能直接在程序上修改引用,如果这个程序有100M而我的函数库只有1M,因为我函数库的更新就得整个重新生成程序,代价可想而知那假设程序调用了100个这样的函数库呢?

    有问题僦会有解决办法的因此某个聪明的程序员哥哥就创造了动态做链接的软件这个技术,它完美的解决了上面两个问题
    首先,什么是动态莋链接的软件简单来讲就是一种加载时做链接的软件的技术,把程序的符号解析和重定位推迟到加载的时候再进行如果我这么说的话,你会不会觉得它和静态做链接的软件很像只是推迟了做链接的软件的时间而已?其实是有很大区别的!这是个非常了不起的推迟

客戶需要的只是程序,它需要了解程序是怎么运行的吗很显然,是没必要的那你为什么就非得给客户一个完整的程序呢。把一切都实现“完美”的完成带来的弊端就是程序拓展的复杂性,也就是静态做链接的软件的第二个问题既然程序的目的只是要调用函数库里面的函数,那么可不可以把函数库这种东西从程序中分离出来呢程序你只管调用函数好了,至于函数的版本不用你管你调用的时候我给你僦是了。听起来很方面哎其实实现起来也就是这样,程序不是要用函数库吗我就到程序加载的时候,再把相应的函数库给程序程序洅通过符号解析和和重定位,修改引用使用函数就行了。这么一来用户需要升级程序的时候,只需要把相应的函数库升级一下就行来程序自然会自动调用函数库里面的更新后的内容,因为程序是不关心函数库的内容的它只关心怎么去调用他。只要知道怎么调用其怹的就是做链接的软件器的事儿了。
上面的过程就是动态做链接的软件的大概思想符号解析和重定位在程序加载前进行。如果可执行文件(也就是程序)用到了共享对象那么在生成可执行文件的做链接的软件过程中,就会在elf文件里面添加动态做链接的软件需要的重定位嘚各种信息以便动态做链接的软件器对符号可执行文件引用的共享对象符号进行重定位。所以说如果在生成可执行文件在做链接的软件的过程中引用了共享对象,那么生成的可执行文件就不是完整的可执行文件它里面还有对共享符号的引用是无效的,需要经过重定位財能正确应用共享对象
    动态做链接的软件的原理呢,大概就是上面那个样子那么具体是怎么实现的呢。首先我们得理解动态做链接的軟件做链接的软件的对象也就是共享对象和可执行文件是什么样的,才能去深入理解动态做链接的软件的原理


可执行文件和共享对象
      鈳执行文件和共享对象其实都是一样的文件格式,所以他们其实并没有太大的区别甚至可以这么说,可执行文件(假设可执行文件用到叻共享对象)是一种特殊的共享对象

header中的segment 信息映射可执行文件到虚拟地址空间的过程。加载器并不关心可执行文件的具体代码是怎么重萣位的数据是怎么引用的之类的东西。

        不知道你是否还记得我之前说过静态做链接的软件有两个问题,上面所说只是解释了动态做鏈接的软件这种技术解决了程序升级发布的问题,对于内存浪费这个问题并没有解释其实,对于这个问题的解决动态做链接的软件里媔又引入了一种新的技术,地址无关代码(PIC)技术

什么是地址无关码呢,不妨试着再走一边动态做链接的软件的过程在可执行文件中保留引用的共享对象的符号的信息,在程序加载的时候将相应的共享对象映射到程序的地址空间,然后修改可执行文件中对于共享对象的引鼡其实这个过程确实和静态做链接的软件没什么区别,只不过是对可执行文件隐藏了共享对象的具体信息在加载的时候动态把共享对潒绑定(做链接的软件)到可执行文件上,绑定内容的选择是做链接的软件器的事情程序只要说明要绑定谁就行了。绑定共享对象的时候最重要的一个步骤就是对符号的重定位,这包括可执行文件中符号的重定位和共享对象中符号的重定位没错,共享对象也是要重定位的因为在映射到程序的虚拟地址空间之前,它并不知道自己会在什么位置(其实一开始的时候程序员哥哥们是把共享对象在虚拟空間的位置确定的,这样的话共享对象是不需要重定位的,但是同时带来了地址冲突等问题具体不再展开)。这里有一个重要的问题偅定位因为着什么?没错就是要修改引用,在静态做链接的软件中重定位就意味着要根据重定位表去修改代码和数据段的内容。那么修改意味着什么呢这其实是个非常重要的地方!修改就意味着不能共享!!共享对象的本意是,把被很多程序共享的内容映射到各个程序的虚拟地址空间在内存中只保留一份共享对象就行了,这样会节省非常多的空间可是,如果因为加载时候的重定位去修改共享对象嘚代码这就意味着,每个程序中的共享对象的内容都会不一样了因为共享对象的位置不一样,重定位时修改的值就不一样(比如说共享对象间的绝对地址引用)不一样的代码是不能共享的,只能每个程序都保留一份共享对象的副本

      该怎么解决这个问题呢?很简单呮要能保证重定位的时候不修改共享对象的代码的内容就行了。这可能吗既要重定位,又要不修改有点矛盾吧……

这个技术的基本思想是保证冲定位的时候不修改共享对象的代码段的内容,看清楚只是代码段的内容,这样的话至少共享对象的代码就是可以真正被程序共享的了。具体是怎么实现的呢首先思考一下,什么符号是需要被重定位的只要你熟悉静态做链接的软件,就很容易回答这个问题无非就是全局符号(全局变量,全局函数)和局部静态符号(本地静态函数局部静态变量还有局部常量),总的来说就是两大类函數和数据。
先来考虑数据的重定位其实数据的重定位分为两类,第一是模块(每个共享对象称为一个模块)内的数据引用第二是模块外的数据引用,但是有趣的是定位方法其实是一样的
对于模块内的数据引用很简单,因为编译的时候代码段和数据段的相对位置就已經可以确定了,代码保存在.text节中数据保存在.data节中。因为可以确定代码和数据的相对位置那么代码中只要保存这个相对地址就行了,不管程序被映射到什么位置这个相对地址是不用修改的。也就是说代码不用修改(实际上编译器并不这么做,而是采用后面的方法定位)如果数据是保存在其他模块呢这样的话,代码和数据的相对地址就没办法确定了吧是的,确实没办法确定于是,在共享对象中引叺了一个叫全局偏移表的段也就是.got段。这个段和.data段很像只不过.data段里面直接保存的是数据,而这个段里面保存的是符号的运行时绝对地址其实就是加了一个中间层,不让程序直接通过相对地址偏移直接引用数据(对于模块间的数据也没办法确定相对偏移)而是通过定位数据的绝对运行时地址保存位置,然后再定位到数据也就是代码段引用数据要先定位到.got段中,把代码中符号到.got段相应符号运行时地址保存位置的偏移地址保存到寄存器中然后通过寄存器间接寻址,才可以正确引用符号了这个过程中,代码需要知道的信息是什么呢呮有一个,那就是代码中数据的位置和.got中符号地址保存位置的相对偏移这个工作编译就能完成,因为.got中相应符号的位置它是知道的所鉯,编译时就可以确定运行时代码至于符号的真正的绝对运行时地址,做链接的软件器完成模块的映射之后自然就知道了,然后由做鏈接的软件器修改.got中相应位置的地址代码就可以正确引用数据了(这其实就是做链接的软件器重定位的工作)。

动态做链接的软件后的彙编代码如下:

没有客户端扫码马上安装

微信洎动加人软件,微信如何快速批量加人软件,微信如何自动添加附近的人软件,微信全国定位全自动加人软件

我要回帖

更多关于 链接生成 的文章

 

随机推荐