This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hello all:
I would like to override the stat() function call using an LD_PRELOAD
library. I've done similar work before, remembered it to be relatively
straight-forward (overriding other library calls), but I can't quite
figure out what I'm doing wrong in this instance. Perhaps someone can
point me in the correct direction.
I've provided some simple test code (not even at the shared library
stage). It can be compiled with
$ make LDFLAGS=-ldl hooked_stat_call
If it is run with a command-line argument, then the stat() routine
(linked at application building) is run. Without a command-line
argument, dlsym() is used to look up the stat() routine address.
First, I don't understand why I must use __xstat as the name lookup.
Previously, I've always used the simple library name. If I try dlsym()ing
'fstat' I receive a NULL address. Can someone tell me if I'm using
the correct name?
Secondly, __xstat() return -1 on my system, not 0 (which is the return
value if I run the system linked stat() call. Here is some output:
ssh-agent $ ./hooked_stat_call
dlsym-stat: Invalid argument
hooked( ".", ... ) returns -1
ssh-agent $ ./hooked_stat_call use_linked_stat
hooked( ".", ... ) returns 0
If __xstat is the correct symbol for stat, then I'm not sure why one
call works and the other does not.
TIA.
--
Keith Hellman #include <disclaimer.h>
khellman@mcprogramming.com from disclaimer import standard
khellman@mines.edu
-*-
public key @ pgp.mit.edu B5354B76
Y!M: mcprogramming AIM/ICQ: 485403897
gtalk: jabber@mcprogramming.com
-*-
"One World, one Web, one Program." - Microsoft(R) promotional ad
"Ein Volk, ein Reich, ein Fuhrer." - Adolf Hitler
/***
* test app for stat preloading
*/
#include <dlfcn.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
int hooked( const char* n, struct stat* s, void* stat_function )
{
static int (*f)( const char*, struct stat* ) = NULL;
if( stat_function ) {
f = stat_function;
} else if( !f ) {
f = dlsym( RTLD_NEXT, "__xstat" );
if( !f ) {
printf( "f = %p: %s\n", f, dlerror() );
}
}
int r = f( n, s );
if(r) {
perror(stat_function?"stat":"dlsym-stat");
}
return r;
}
int main( int argc, char* argv[] )
{
struct stat s;
int r = hooked( ".", &s, argc > 1 ? stat : NULL );
printf( "hooked( \".\", ... ) returns %d\n", r );
return 0;
}
Attachment:
signature.asc
Description: Digital signature
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |