LD_PRELOAD加载动态库
Posted yu121
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LD_PRELOAD加载动态库相关的知识,希望对你有一定的参考价值。
LD_PRELOAD,是Linux系统的一个环境变量,用于动态库的加载,动态库加载的优先级最高。它可以影响程序的运行时的链接,它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。
一般情况的加载顺序:
LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。
1. 编写一个fopen函数
prog.c
#include <stdio.h> int main(void) { FILE *fd = fopen("test.txt","r"); if (!fd) { printf("fopen() returned NULL "); return 1; } printf("fopen() succeeded "); return 0; }
创建test.txt文件,使其编译成功
2. 编写fopen一个失败的文件, myfopen.c
#include <stdio.h>
FILE *fopen(const char *path, const char *mode) {
printf("Always failing fopen ");
return NULL;
}
编译为自己的动态库myfopen.so
gcc -Wall -fPIC -shared -o myfopen.so myfopen.c
注:
替换结束,要还原函数调用关系,用命令unset LD_PRELOAD 解除
查询依赖关系,可以用ldd “程序名称”
参考文档:
https://catonmat.net/simple-ld-preload-tutorial
https://www.cnblogs.com/saolv/p/9761371.html
创建test.txt文件,使其编译成功
以上是关于LD_PRELOAD加载动态库的主要内容,如果未能解决你的问题,请参考以下文章