Система: FreeBSD 8.2-RELEASE
Собираем нашу библиотеку
За подробностями: man ld.so
/* Файл test.c */ #include <unistd.h> int main(void) { write(1, "test1\n", 6); return 0; }
/* Файл newlib.c */ /* Фактически write это еще одна библиотечная функция, которая надстроена над настоящим системным вызовом _write, "старая" функция будет по-прежнему доступна через вызов _write (в linux используется glibc, а вызов имеет имя __write) */ extern int _write(int fd, const char *buff, long len); int write(int fd, const char *buff, long len) { _write(fd, "test2\n", 6); _write(fd, buff, len); }
Собираем нашу библиотеку
$ gcc newlib.c -fPIC -c
newlib.c:10:2: warning: no newline at end of file
$ gcc newlib.o -shared -o newlib.soСобираем исполняемый файл
$ gcc test.c
test.c:9:2: warning: no newline at end of fileЗапуск файла без подмены функции
$ ./a.out
test1Запуск файла с подменой функции
$ export LD_PRELOAD=`pwd`/newlib.so
$ ./a.out
test2
test1Очищаем переменную
$ unset LD_PRELOAD
$ ./a.out
test1
За подробностями: man ld.so
Комментариев нет:
Отправить комментарий