![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链接器
文章平均质量分 85
_kerneler
这个作者很懒,什么都没留下…
展开
-
GOT表和PLT表知识详解
作者:海枫链接:https://www.zhihu.com/question/21249496/answer/126600437来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。在介绍PLT/GOT之前,先以一个简单的例子引入,各位请看以下代码:#include <stdio.h>void print_banner(){printf(“Welcome to World of PLT and GOT\n”);}int main(void){prin转载 2022-03-09 21:13:06 · 1256 阅读 · 0 评论 -
gcc编译参数-fPIC的一些问题
ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。gcc -shared -fPIC -o 1.so 1.c这里有一个-fPIC参数PIC就是position indepe转载 2022-03-03 16:53:17 · 407 阅读 · 0 评论 -
ldd not a dynamic executable
ldd 是我们经常贯用的检测 PE文件依赖的好工具.可是今天我发现这了么个问题. 我用 ldd 看我的程序时却输出not a dynamic executable其实原因很简单就是我的程序是x64的. 而我把这个x64的程序放到了x32的机器上,用ldd看就是这种效果.反过来 32位的app 在用64位机器也不行查看系统版本 :file /bin/bash其实我们也可以使用 另外一命令来看readelf -d 你的程序 | grep NEEDED[root@l135 ~]# read转载 2020-10-21 12:32:08 · 824 阅读 · 0 评论 -
ldd 安全问题 | 更换链接器
转:https://blog.csdn.net/kwuwei/article/details/24721281转:https://blog.csdn.net/buaa_shang/article/details/8929077ldd介绍ldd本身不是一个程序,而仅是一个shell脚本$ file /usr/bin/ldd/usr/bin/ldd: Bourne-Again shell script text executableldd命令其实是依靠设置一些环境变量而实现的(也就是说ldd的作用原创 2020-07-17 12:13:19 · 562 阅读 · 0 评论 -
深入理解链接过程
下面这张图,相信很多人已经很熟悉很熟悉了!!!其中最后一个过程,链接可以1 执行于编译时,也就是在源代码被翻译成机器代码时;2 也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时;3 甚至可以执行于运行时,由应用程序来执行。所以说链接以上的顺序并不是绝对固定的!!!4 更加详细的内容见:https://www.cnblogs.com/mickole/articles/3659112.html接下来的内容主要还是围绕链接的一些比较深入的细节。从传统静态链接到加载时的共享库的动态链接,原创 2020-07-28 15:00:48 · 346 阅读 · 0 评论 -
彻底理解链接器:四,重定位
重定位程序的运行过程就是CPU不断的从内存中取出指令然后执行执行的过程,对于函数调用来说比如我们在C/C++语言中调用简单的加法函数add,其对应的汇编指令可能是这样的:call 0x4004fd其中0x4004fd即为函数add在内存中的地址,当CPU执行这条语句的时候就会跳转到0x4004fd这个位置开始执行函数add对应的机器指令。再比如我们在C语言中对一个全局变量g_num不断加一来进行计数,其对应的汇编指令可能是这样的: mov 0x400fda %eax add $0x1 %eax转载 2020-07-28 21:46:09 · 1972 阅读 · 0 评论 -
彻底理解链接器:三,库与可执行文件
库与可执行文件在链接器可操作的元素这一节中我们提到,链接器可以操作的最小单元为目标文件,也就是说我们见到的无论是静态库、动态库、可执行文件,都是基于目标文件构建出来的。目标文件就好比乐高积木中最小的零部件。给定目标文件以及链接选项,链接器可以生成两种库,分别是静态库以及动态库,如图所示,给定同样的目标文件,链接器可以生成两种不同类型的库,接下来我们分别介绍。静态库假设这样一个应用场景,基础设计团队设计了好多实用并且功能强大的工具函数,业务团队需要用到里面的各种函数。每次新添加其中一个函数,业务团队转载 2020-07-28 21:42:30 · 1110 阅读 · 0 评论 -
彻底理解链接器:二,符号决议
符号决议在这个过程当中,链接器需要做的工作就是确保所有目标文件中的符号引用都有唯一的定义。要想理解这句话我们首先来看看一个典型的c文件里都有些什么。c源文件中都有什么如图所示是一个典型的c源文件,该文件中的变量可以划分为两类:全局变量:比如x_global_uninit,x_global_init,fn_c。只要程序没有结束运行,全局变量都可以随时使用。注意,用static修饰的全局变量比如y_global_uninit,其生命周期也等同于程序的运行周期,只是这种全局变量只能在所被定义的文件当中使用转载 2020-07-28 21:37:16 · 385 阅读 · 0 评论 -
彻底理解链接器:一,概念
该系列完整的文章目录:在介绍本章的主题之前,我们先来看几个问题:问题一写C/C++的同学应该经常遇到这样的一个Error:undefined reference to ABC在遇到这样的问题时你知道这背后到底哪里出问题了吗? 你通常都能顺利解决类似问题吗?问题二作为世界上最大的同性交友网站GitHub,里面有很多很棒的项目,一般我们或者直接下载其发布版(release version),或者下载源码自己编译,不管是直接下载发布版还是自己编译,最终都会得到一个(或几个)以.so或者.a为结尾的转载 2020-07-28 21:31:13 · 371 阅读 · 0 评论