LINUX.ORG.RU

LD_PRELOAD и extern int open (__const char *__file, int __oflag, ...)


0

0

Есть задача - заменить open с помощью LD_PRELOAD. Ещё надо было заменить всякие readdir и stat, но с этим мне помогли. А вот open я делаю свой, подсовываю в LD_PRELOAD а оно не работает. Программа всё равно использует оригинальный open. Что я делаю не так? Как правильно экспортировать функции с переменным числом агрументов?

★★★★★

main.cpp:

#include <fcntl.h>
#include <stdio.h>

int main() {
	printf( "open %d\n", open( "/tmp/testfl", O_CREAT, 0600 ) );
	return 0;
}

~/src/tmp$ g++ main.cpp -o t

lib.cpp:

#include <fcntl.h>
#include <dlfcn.h>
#include <stdio.h>

int open (__const char *__file, int __oflag, ...) {
	int ( *d_open )( __const char *__file, int __oflag, ... ) = ( int (*)(__const char *, int, ...) ) dlsym( RTLD_NEXT, "open" );
	printf( "wrapped\n" );
	return ( *d_open )( __file, __oflag );
}

~/src/tmp$ g++ -o lib.so -shared -fPIC lib.cpp -ldl
~/src/tmp$ LD_PRELOAD=./lib.so ./t
wrapped
open 3

А я что делаю не так?

summatus
()
Ответ на: комментарий от summatus

Точно. Ложная тревога. Просто злая проприетарная программа в определённый момент блокирует stderr и отладочная инфа от либы не поступает. Перенаправил в файл - видно, что работает.

legolegs ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.