secmask
secmask

Reputation: 8127

Cannot get libc override function work with LD_PRELOAD?

I'm try to override some libc function using LD_PRELOAD technique, but cannot make it work. this is the 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 file, no name mangle here)

and the main app

#include <string.h>
int main(){
    const char* s = "hello";
    printf("length=%d\n",strlen(s));
}

gcc -o main main.c
then start to run it

LD_PRELOAD=./strlib.so ./main

it run but seem that it did not call my override function

$ LD_PRELOAD=./strlib.so ./main 
length=5

Did I do anything wrong here?

@edit: as Emest mention, a changed the main.c to avoid compiler optimize, but it still did not work.

#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
length=4

Upvotes: 1

Views: 668

Answers (1)

Ernest Friedman-Hill
Ernest Friedman-Hill

Reputation: 81724

Check the assembly code ( use the -s argument to gcc.) The compiler will optimize out the strlen() call on the compile-time constant string "hello", computing the length at compile time instead. Try calling your function on a string whose length isn't known until runtime, like one of the arguments to main(), and this should work as you expect.

Upvotes: 2

Related Questions