【Linux】LD_PRELOAD用法

【Linux】LD_PRELOAD用法LD PRELOAD 是个环境变量 用于动态库的加载 动态库加载的优先级最高 一般情况下 其加载顺序为 LD PRELOAD gt LD LIBRARY PATH gt etc ld so cache gt lib gt usr lib 程序中我们经常要调用一些外部库的函数 以 malloc 为例 如果我们有个自定义的 malloc 函数 把它编译成动态库后 通过 LD PRELOAD 加载 当程序中调用 malloc 函数时 调用的

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。程序中我们经常要调用一些外部库的函数,以malloc为例,如果我们有个自定义的malloc函数,把它编译成动态库后,通过LD_PRELOAD加载,当程序中调用malloc函数时,调用的其实是我们自定义的函数,下面以一个例子说明。

// test.c #include 
    #include 
    int main() { int i = 0; for (; i < 5; ++i) { char *c = (char*)malloc(sizeof(char)); if (NULL == c) { printf("malloc fails\n"); } else { printf("malloc ok\n"); } } return 0; }

编译运行,结果如下:

$gcc -o test test.c $./test malloc ok malloc ok malloc ok malloc ok malloc ok

可以看出,程序运行没有问题,我们稍作修改,自定义malloc。

// preload.c #include 
    #include 
    void* malloc(size_t size) { printf("%s size: %lu\n", __func__, size); return NULL; }

然后把自定义的malloc打包为动态库。

$gcc -shared -fpic -o libpreload.so preload.c

接着使用LD_PRELOAD加载libpreload.so,看看情况如何:

$LD_PRELOAD=./libpreload.so ./test malloc size: 1 malloc fails malloc size: 1 malloc fails malloc size: 1 malloc fails malloc size: 1 malloc fails malloc size: 1 malloc fails

看到了吧,5次malloc都失败了,如果不知道是 LD_PRELOAD在作怪,那可能分析很长时间都找不出原因所在。这个 LD_PRELOAD就是把双刃剑,用好了可以帮助我们,如果别有用心,那可能会有意外的惊喜。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205359.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:12
下一篇 2026年3月19日 下午6:13


相关推荐

  • TYPORA主题更换

    TYPORA主题更换TYPORA 主题更换 0 主题推荐 Liangjingkan DrakeTypora 主题 扁平化明暗主题 VueMaterialJ 主题 github com 1 主题下载下载完成后解压 复制文件夹内所有 css 文件 2 更换主题点击 文件 偏好设置 外观 主题文件夹 直接把刚才复制的 CSS 粘贴到 主题文件夹 3 选择你的主题重启 TYPORA 点击主题 选择自己的主题

    2026年3月18日
    2
  • bind函数的作用

    bind函数的作用建立 tcp 连接的时候服务器端执行流程调用 socket 函数 建立一个套接字 该套接字用于接下来的网络通信调用 bind 函数 将该套接字绑定一个地址和端口号调用 listen 函数 使用该套接字监听连接请求调用 accept 函数 接受该套接字连接请求客户端执行流程调用 socket 函数 创建一个套接字调用 connect 函数 使用该套接字与服务器进行连接服务器端和客户端程序的显著区别在于

    2026年3月17日
    2
  • Java继承的概念及方法

    Java继承的概念及方法继承的概念继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。生活中的继承:兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。所以继承需要符合的关系是:

    2022年7月8日
    28
  • 爆火的OpenClaw怎么玩?谷歌老哥40天打磨终极配置单开源:让你的龙虾越养越聪明,自动打怪升级

    爆火的OpenClaw怎么玩?谷歌老哥40天打磨终极配置单开源:让你的龙虾越养越聪明,自动打怪升级

    2026年3月13日
    2
  • android布局文件详解

    android布局文件详解本文是我从DeclaringLayout翻译而来的文章,如果有不当之处请指出DeclaringLayout布局决定了Activity所展现的样子,他决定了布局的结构和控制着你展现给用户所有的元素,你可以通过两种方式来声明你的布局.①在xml文件中定义UI元素:android提供了与View类及其子类相关的简单易懂的标签。   ②在运行时期定义你的布局,即

    2022年6月2日
    55
  • 双重求和∑matlab_求和∑的性质

    双重求和∑matlab_求和∑的性质目录一、复习求和符号∑二、二重求和的定义三、双重求和∑∑交换求和顺序一、复习求和符号∑    自从约瑟夫·傅立叶于1820年引入求和符号∑(大写的希腊字母sigma)以来,求和∑以及双重求和∑∑在数学公式推导,命题证明中被经常使用,掌握它的定义和性质对于提高我们的数学能力是必不可少的。注意我们在此只讨论有限项的求和。结合律:∑i=1n(ai+b…

    2022年10月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号