美文网首页
程序员自我修养5-linux动态链接

程序员自我修养5-linux动态链接

作者: S_s_s_a53f | 来源:发表于2017-08-16 16:14 被阅读0次

1.被执行的是shell脚本或perl、python等这种解释型语言的脚本,那么它的第一行往往是“#!/bin/sh”或"#!/usr/bin/perl"或“#!/usr/bin/python”,这时候前两个字节'#'和'!'就构成了魔数,系统一旦判断到这两个字节,就对后面的字符串进行解析,以确定具体的解释程序的路径。
2.RVA相对虚拟地址、VA虚拟地址,每个PE文件在装载时都会有一个装载目标地址,这个地址就是所谓的基地址。

动态链接库

1.GOT全局偏移表:指向这些变量的指针数组。

图片.png

当指令中需要访问变量b时,程序会先找到GOT,然后根据GOT中变量所对应的项找到变量的目标地址。
2.查看GOT的位置:
objdump -h pic.so
查看pic.so的需要在动态链接时重定位项:
objdump -R pic.so

PLT的基本原理:

ELF将GOT拆分成两个表叫做“.got”和".got.plt"。其中".got"用来保存全局变量引用的地址,".got.plt"用来保存函数引用的地址。
1.在linux下查看一个可执行文件所需要的动态链接器的路径:
readelf -l a.out | grep interpreter
查看".dynamic"段的内容:
readelf -d lib.so
查看一个程序主模块或一个共享库依赖于哪些共享库:
ldd program1
查看ELF文件的动态符号表及它的哈希表:
readelf -sD lib.so
查看一个动态链接的文件的重定位表:
readelf -r lib.so/readelf -S lib.so

dlopen()函数:

用来打开一个动态库,并将其加载到进程的地址空间,完成初始化过程

dlsym函数:

是运行时装载的核心部分,我们可以通过这个函数找到所需要的符号。

dlerror()函数:

用来判断上一次调用是否成功。如果返回null,则表示上一次调用成功,如果不是,则返回相应的错误消息。

dlclose()函数:

将一个已经加载的模块卸载


相关文章

网友评论

      本文标题:程序员自我修养5-linux动态链接

      本文链接:https://www.haomeiwen.com/subject/dkmirxtx.html