On Sat, Nov 10, 2007 at 12:43:11AM +0300, Dmitry E. Oboukhov wrote: > > есть libconnect в портах freebsd - там перехватывается connect(2), дабы > > сделать > > bind(2) на локальную сторону сокета (bind адрес берется из переменной > > окружения > > CONN_ADDR). используется так: > > набросал такой тестик, но почему-то не раотает > что-то я делаю не так? > > $ cat main.c > #include <stdio.h> > > void foo(void) > { > printf("This is foo() from main\n"); > } > > int main(void) > { > foo(); > return 0; > } > > $ cat test_lib.c > #include <stdio.h> > > void foo(void) > { > printf("This is foo() from library\n"); > } > > $ make clean all > rm -f library.so program > gcc -shared -o library.so test_lib.c > gcc main.c -o program > > nb:[/home/dimka/test]$ LD_PRELOAD=/home/dimka/test/library.so ./program > This is foo() from main > > или из простого бинарника функции не перехватить? >
похоже только библиотечную функцию -- сам не знал -- причем она должна иметь __attribute__((weak)). чтобы довести тему до конца проиллюстрируем примером. foo.c int foo() { printf("%s -> %s()\n", __FILE__, __func__); return 0; } gcc -shared foo.c -o foo.so mainfoo.c int __attribute__((weak)) foo() { printf("%s -> %s()\n", __FILE__, __func__); return 0; } gcc -shared mainfoo.c -o mainfoo.so main.c main() { foo(); return 0; } gcc main.c mainfoo.so -o main LD_LIBRARY_PATH=. ./main mainfoo.c -> foo() LD_LIBRARY_PATH=. LD_PRELOAD=foo.so ./main foo.c -> foo() если статически линковать - то уже не работает. т.е. gcc main.c mainfoo.c -o main LD_PRELOAD=./foo.so ./main mainfoo.c -> foo() селяви... :( /swp -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]