如何通过LD_PRELOAD降低程序的读写速度

MrMoment 2010-10-18 04:25:16
由于需要仿真java在比较慢的磁盘上的运行,想通过自己重写libc的一些磁盘读写操作的函数,让每一次读写后sleep几毫秒来实现。现在只知道如何通过LD_PRELOAD方式来hack底层调用。所以问题就是:
1.java这类程序调用了哪些磁盘、文件读写的函数呢?
2.如果要重写读写函数,是否能够调用原有的读写函数?比如
原来的是old_write(),能否实现
old_write(param){
old_write(param);
sleep(10);
}这种方式?如果不行是不是要仿照old_write的函数体来重写一次?
...全文
96 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
justkk 2010-10-19
"以及其它读写函数是不是最终都调用的这两函数?"
这个我也不知..

"能否再指教一下这两个函数的位置"
其实我没看过linux源码,你用下面的命令找找看
find /path -name "*.c"|xargs grep -w write
回复
MrMoment 2010-10-19
对linux源码不熟……找了半天,不知道这两函数在哪个文件实现的?
我在ubuntu下。用apt-get install linux-source-2.6.24
然后把这个包解压,在fs目录下和几个可能的目录下都没找到……倒是看到其他各种read write。
能否再指教一下这两个函数的位置,以及其它读写函数是不是最终都调用的这两函数?
回复
justkk 2010-10-19
从linux源码中找找看..
回复
MrMoment 2010-10-19
ok.好像是我要的。不过由于我只是想增加一些延时,所以如果有这两个函数的原始源码就好了。你知道哪儿有么?
回复
justkk 2010-10-19
那你重载这两个试试看呢
write(int fd, void *buff, int length)
read(int fd, void *buff, int length)
回复
MrMoment 2010-10-19
strcmp我已经实现了,很多程序要调用strcmp都会调用我的,打出一行字“hack function invoked”(这个网上有例子)。
回复
justkk 2010-10-19
那你先用简单的试验看看呢
重载strcmp函数,看效果如何..
回复
MrMoment 2010-10-19
但是如果我把函数重写了就会加载我的函数对吧?比如我可以照网上的例子把字符串比较标准函数strcmp重写,任何字符串都比较返回正确。但是这个例子比较简单,而如果重写磁盘操作就不知道怎么样实现了,而且不知道要重写哪些函数?
又看了java源码,发现比如OutputStream里面的write(int)并没有暴露源码,而其他形式的write,比如write(char[], int offset, int length)又是最终调用write(int)的。。。
回复
justkk 2010-10-18
LD_PRELOAD是指定程序启动之前装载的一个动态库吧..
感觉是基于程序的,而不是用来重载函数的
回复
MrMoment 2010-10-18
换句话说就是hook住java的磁盘读写……
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4150

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-10-18 04:25
社区公告
暂无公告