Linux 共享库LD_PRELOAD环境变量
来源:互联网 发布:oa数据库设计 编辑:程序博客网 时间:2024/06/06 07:34
共享库转载器有许多可供配置的环境变量,比如我们前面介绍的LD_LIBRARY_PATH环境变量。本文只重点介绍LD_PRELOAD环境变量,因为这个环境变量体现了共享库一个非常重要的特性:共享库覆盖。
下面是man手册中对于LD_PRELOAD环境变量的介绍:
我们以一个覆盖标准库sleep函数的例子来说明如何应用LD_PRELOAD环境变量。
首先给出我们的测试程序,程序很简单,休眠1秒钟退出。
使用如下命令编译
使用ldd查看可执行文件test依赖的共享库:
在未设置LD_PRELAOD环境变量时,程序运行将调用标准库的sleep函数。下面我们将定义自己的sleep函数,把这个函数编译到一个库,并使用这个库覆盖标准库的sleep函数。
首先给出定义sleep函数的源文件mysleep.c:
我们的sleep函数接受一个以毫秒为单位的参数,函数首先会调用fprint输出一行调试信息,以帮助我们了解sleep函数是否覆盖成功。然后我们使用dlsym函数获取标准库中sleep的指针,并使用标准库的sleep来实现我们自定义的sleep。需要强调的是,如果我们想要覆盖标准库的某个函数,我们自定义的函数,必须和被覆盖的函数声明相一致。
使用以下makefile文件编译库libmysleep.so.1:
使用下面的命令添加库目录到共享库装载程序的搜索目录:
把我们自己的库libmysleep.so.1添加到LD_PRELOAD环境变量的覆盖库列表中:
然后使用ldd查看可执行文件test依赖的共享库:前后对比可发现比没有设置LD_PRELOAD环境变量时多了两个共享库依赖,其中一个是我们自己的覆盖库libmysleep.so.1,另一个是libmysleep.so.1库的依赖库libdl.so.2,因为我们调用了dlsym函数。
好了,我们已经成功完成了标准库sleep函数的覆盖,运行程序输出如下:
最后一步也很重要,请删除LD_PRELOAD环境变量,除非你想在当前Session中让自己的库一直覆盖下去,也许你只是在测试:
0 0
- Linux 共享库LD_PRELOAD环境变量
- Linux 共享库LD_PRELOAD环境变量
- LD_PRELOAD环境变量
- LD_PRELOAD环境变量
- linux LD_PRELOAD
- linux中环境变量LD_PRELOAD是怎样工作的?
- Linux下入门级导出函数截获-使用LD_PRELOAD环境变量
- linux中环境变量LD_PRELOAD是怎样工作的?
- 小心环境变量-浅谈LD_PRELOAD
- linux共享库位置配置(LD_LIBRARY_PATH环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- UNIX下的LD_PRELOAD环境变量
- dirname - 截取给定路径的目录部分
- windows 系统下 MongoDB 服务安装教程
- qt5.6.0在Mac平台编译10.7版本的软件出错
- TCP/IP(五):TCP 协议详解
- Spring的PropertyPlaceholderConfigurer应用
- Linux 共享库LD_PRELOAD环境变量
- 第35篇 翻译webrtc官方文档(二) 及word下载bug及php命名空间
- mysql时间戳
- CSS样式表小记
- Android编程实现将压缩数据库文件拷贝到安装目录的方法
- ES6之模板字符串
- CorelDRAW中怎么实现拆分调和对象
- java.lang.OutOfMemoryError: PermGen space 问题解决
- 0xE8008018 iOS真机运行时错误