Как включить LD_PRELOAD чтоб он работал?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 19.09.2016 19:18:04

Здравствуйте. Есть библиотека libnet.so, которая заменяет системные функции по части работы с сетью (в частности функции сокетов). Для приложений на С она работает следующим образом:
Из командной строки набираю
Код: Выделить всё
LD_PRELOAD=libnet.so ./project1

В этом случае библиотека подменяет системные функции своими и все работает корректно.

В случае приложения на FPC внешне всы выглядит точно так же, но на практике функции fpSend fpRecv не подменяются и приложение работает в обычном режиме. С чем это может быть связано и какрешить проблему?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение fedan » 19.09.2016 21:16:29

Попробуй из С апи не кросс платформа конечно: send, recv, socket, open.
Если кроссплатформа, то рекомендую обертки к ним сделать.
fedan
новенький
 
Сообщения: 70
Зарегистрирован: 15.09.2016 21:18:48

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 19.09.2016 22:13:27

fedan в каком модуле находятся функции в таком виде? И разве fp аналоги не являются той же самой оберткой для родного сишного апи?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение fedan » 20.09.2016 13:39:15

CRobin писал(а):fedan в каком модуле находятся функции в таком виде? И разве fp аналоги не являются той же самой оберткой для родного сишного апи?

system

Наверняка чтобы было: сделай обертки к этим функциям: external 'libnet.so'

PS: я сейчас в исходиках fpcsrc запустил find, там под каждую OS своя реализация, но в итоге все они в system.pp прилетают
fedan
новенький
 
Сообщения: 70
Зарегистрирован: 15.09.2016 21:18:48

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 20.09.2016 15:57:35

fedan если честно, я вообще не понимаю что не так. Как заставить Lazarus использовать системный АПИ вместо собственной (кроссплатформенной?) реализации?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение Лекс Айрин » 20.09.2016 16:16:43

CRobin, посмотрите в определении собственной (кросс) реализации.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 20.09.2016 16:33:44

Лекс Айрин что вы имеете в виду?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение Лекс Айрин » 20.09.2016 16:55:25

CRobin, что собственная реализация это прокладка к внешней функции к dll. Иногда, просто импортирующая ее, а иногда адаптирующая к правилам языка.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 20.09.2016 17:18:14

Лекс Айрин не могу найти место где происходит импорт(вызов) системной функции. Все функции типа fp^ не являются обвязкой, иначе бы LD_PRELOAD работал корректно.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение Дож » 20.09.2016 18:01:15

не могу найти место где происходит импорт(вызов) системной функции. Все функции типа fp^ не являются обвязкой, иначе бы LD_PRELOAD работал корректно.

Нужно смотреть sockets.pp в исходниках rtl, что там реализовано для линуксовой версии функции. Скорее всего, это просто кроссплатформенные обёртки над Send и Recv.

1. Но вот какие Send и Recv -- из so'шки или на основе syscall'ов нужно смотреть.
2. Даже если на основе библиотеки, не исключено, что что-то влинковывается статично, т.е. вшивается в сам бинарь при компиляции.
3. Что такое libnet.so? Вы уверены, что это станадртная линуксовая библиотека, содержащая стандартные линуксовые Send и Recv, а не какая-то сторонняя либа?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение fedan » 20.09.2016 18:37:03

int send(
_In_ SOCKET s,
_In_ const char *buf,
_In_ int len,
_In_ int flags
);

function send(s:TSocket; buf:PAnsiChar BufLen: Integer; Flags: LongWord): Integer; external 'libnet.so'
fedan
новенький
 
Сообщения: 70
Зарегистрирован: 15.09.2016 21:18:48

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 20.09.2016 18:38:12

Дож тут два варианта, либо fp* это хардкод паскаля под конкретную ОС, либо второй вариант как вы сказали. От PRELOAD пришлось отказаться, использую syscall c собственной обвязкой.
Последний раз редактировалось CRobin 21.09.2016 16:18:43, всего редактировалось 1 раз.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение Дож » 20.09.2016 19:58:38

Я уже сам всё посмотрел в сурсах:
Код: Выделить всё
./packages/rtl-extra/src/linux/unixsock.inc:  fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);

rtl/linux/x86_64/sysnr.inc:  syscall_nr_recvfrom                           = 45;

packages/rtl-extra/src/linux/unixsock.inc:
Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):cint; inline;
var
  Args:array[1..6] of TSysParam;
begin
  args[1]:=a1;
  args[2]:=a2;
  args[3]:=a3;
  args[4]:=a4;
  args[5]:=a5;
  args[6]:=a6;
  SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
  internal_socketerror:=fpgeterrno;
end;
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение CRobin » 20.09.2016 20:35:40

Дожто есть по сути, функции из либы здесь не могут быть вызваны никак? Я не совсем понимаю что делает Linux в случае объявления LD_PRELOAD.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как включить LD_PRELOAD чтоб он работал?

Сообщение Дож » 20.09.2016 21:57:02

syscall'ы -- это способ вызова системных функций в линуксе. Он не требует никаких либ, просто специальный ассемблерный код говорит какой по номеру вызов нужен (у recv и recvfrom, как мы видим, номер 45). Ни от каких so'шек такой код не зависит.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru