zoukankan      html  css  js  c++  java
  • 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文件,使其编译成功

  • 相关阅读:
    Christmas Jump(k_push)
    cloudyarn(k_push)
    Eye sketch
    Candy Treasure Box
    Active Ball
    Lotus words
    Super Fish
    [POJ2436] Disease Management
    [bzoj3376] Cube Stacking 方块游戏
    [POJ3009] Curling 2.0
  • 原文地址:https://www.cnblogs.com/yu121/p/12846040.html
Copyright © 2011-2022 走看看