我尝试使用LD_PRELOAD技术覆盖某些libc函数,但无法使其工作。 这是strlib.c
#include <stdio.h>
size_t strlen(const char *s){
printf("take strlen for %s\n",s);
return 0;
}
gcc -shared -fPIC -o strlib.so strlib.c
(.c文件,此处没有名称错误)
和主应用
#include <string.h>
int main(){
const char* s = "hello";
printf("length=%d\n",strlen(s));
}
gcc -o main main.c
然后开始运行它
LD_PRELOAD=./strlib.so ./main
它运行但似乎没有调用我的覆盖函数
$ LD_PRELOAD=./strlib.so ./main
length=5
我在这里做错了吗?
@edit:正如Emest所提到的,改变了main.c以避免编译器优化,但它仍然无法正常工作。#include <string.h>
int main(int argc,char** argv){
const char* s = "hello";
printf("length=%d\n",strlen(argv[1]));
}
$ LD_PRELOAD =。/ strlib.so ./main hehe
长度= 4
答案 0 :(得分:2)
检查汇编代码(使用gcc的-s参数。)编译器将优化编译时常量字符串&#34; hello&#34;上的strlen()调用,在编译时计算长度。尝试在一个字符串上调用你的函数,该字符串的长度在运行时都不知道,就像main()的一个参数一样,这应该按照你的预期工作。