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文件,使其编译成功

原文地址:https://www.cnblogs.com/yu121/p/12846040.html