[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: gdb и elf



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



Reply to: