码迷,mamicode.com
首页 > 其他好文 > 详细

LD_PRELOAD加载动态库

时间:2020-05-07 22:53:50      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:unset   名称   div   通过   style   usr   linux系统   调用   不同   

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\n");
                return 1;
              }
    printf("fopen() succeeded\n");
    return 0;
} 

创建test.txt文件,使其编译成功  

技术图片

 

 2. 编写fopen一个失败的文件, myfopen.c

#include <stdio.h>

FILE *fopen(const char *path, const char *mode) {

    printf("Always failing fopen\n");

    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加载动态库

标签:unset   名称   div   通过   style   usr   linux系统   调用   不同   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!