如何通过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的函数体来重写一次?
...全文
889 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的磁盘读写……

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧