转载https://blog.csdn.net/iEearth/article/details/49952047

还有一篇博客也可以看看https://blog.csdn.net/xp5xp6/article/details/52513428

https://www.cnblogs.com/openix/p/3521166.html

/etc/ld.so.conf详解  :

https://www.cnblogs.com/chris-cp/p/3591306.html

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

// test.c
#include <stdio.h>
#include <stdlib.h> 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 <stdio.h>
#include <stdlib.h> 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就是把双刃剑,用好了可以帮助我们,如果别有用心,那可能会有意外的惊喜。

--------------------- 作者:aidear_evo 来源:CSDN 原文:https://blog.csdn.net/iEearth/article/details/49952047?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

【Linux】LD_PRELOAD用法的更多相关文章

  1. linux curl用法详解

    linux ‍‍curl用法详解 ‍‍curl的应用方式,一是可以直接通过命令行工具,另一种是利用libcurl库做上层的开发.本篇主要总结一下命令行工具的http相关的应用, 尤其是http下载方面 ...

  2. [转载]expect spawn、linux expect 用法小记

    原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...

  3. [转帖]linux lsof 用法简介

    linux lsof 用法简介 https://www.cnblogs.com/saneri/p/5333333.html 1.简介: lsof(list open files)是一个列出当前系统打开 ...

  4. Linux find 用法示例

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  5. linux gksu用法

    apt-get install gksu gksu是linux下图形化的su/sudo工具 sudo 用来执行命令行(CLI)程序 gksu 用来执行图形的(GUI)程序 GUI = Graphica ...

  6. linux exec用法总结

    Linux中exec的用法总结 先总结一个表: exec命令 作用 exec ls 在shell中执行ls,ls结果显示结束后不返回原来的的目录中,而是/(根目录) exec <file 将fi ...

  7. Linux man 用法小结(Linux指令学习笔记)

    今天买了一本<<Linux命令行与shell脚本编程大全>>,想利用暑假放假的时间系统的学习一下 Linux的shell脚本.今天看了一下书,才发现我之前学习,把Linux s ...

  8. linux定时器用法

    linux定时器  原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...

  9. Linux find用法

    Linux中find常见用法示例 ----摘抄哪里忘记了 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} ...

随机推荐

  1. update linux dns,no need restart

    [root@hc--uatbeta2 ~]# cd /etc[root@hc--uatbeta2 etc]# vi resolv.conf ******* nameserver 10.123.23.*

  2. 【清北学堂2018-刷题冲刺】Contest 3

     比较数学的一场,难度稍大. Task 1:数数 [问题描述]  fadbec 很善于数数,⽐如他会数将a 个红球,b 个黄球,c 个蓝球,d个绿球排成⼀列,求出任意相邻不同⾊的方案数⽬.  现在R ...

  3. 微服务框架之微软Service Fabric

    常见的微服务架构用到的软件&组件: docker(成熟应用) spring boot % spring cloud(技术趋势) Service Fabric(属于后起之秀 背后是微软云的驱动) ...

  4. Visual Studio 2015中设计UML类图

    1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是 ...

  5. MySQL5.7单实例二进制包安装方法

    MySQL5.7单实例二进制包安装方法 一.环境 OS: CentOS release 6.9 (Final)MySQL: mysql-5.7.20-linux-glibc2.12-x86_64.ta ...

  6. Web API中的Help Page

    一.自动创建带帮助的WebAPI 第一步  创建项目的时候选择WebAPI 如下图所示,生成的项目会自动生成帮助文档 第二步  设置调用XML文档的代码 第三步 设置项目注释XML文档生成目录 项目— ...

  7. canvas.drawImage()方法详解

    首先看html5.js /**@param {Element} img_elem@param {Number} dx_or_sx@param {Number} dy_or_sy@param {Numb ...

  8. java读取配置文件信息

    ResourceBundle resource = ResourceBundle.getBundle("shopxx");//不要加.properties后缀,我加了报错 reso ...

  9. golang channle close() x,ok := <- c

    close为内置函数 close内置函数关闭一个通道channle,其效果为:在最后的值从已关闭的信道中被接收后,任何对其的接收操作都会无阻塞的成功.对于已关闭的信道使用v,ok := <-   ...

  10. Tomcat与Web应用

    1.Web是一种分布式应用架构,旨在共享分布 在网络上的各个Web服务器中的所有互相链接的信息.Web使用超级文本技术(HTML)来链接网络上的信息,信息存放在服务器端,客户机通过浏览器查找网络中的各 ...