无法使用LD_PRELOAD获取libc覆盖功能?

时间:2014-06-05 11:06:33

标签: c gcc

我尝试使用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

1 个答案:

答案 0 :(得分:2)

检查汇编代码(使用gcc的-s参数。)编译器将优化编译时常量字符串&#34; hello&#34;上的strlen()调用,在编译时计算长度。尝试在一个字符串上调用你的函数,该字符串的长度在运行时都不知道,就像main()的一个参数一样,这应该按照你的预期工作。