Почему LD_PRELOAD не работает с Python?

Использование функции вставки для open () с Python, похоже, не работает после первых нескольких вызовов. Я подозреваю, что Python выполняет какую-то инициализацию, или что-то временно обходит мою функцию.

Здесь явно перехватывается вызов open :

$ cat a
hi
$ LD_PRELOAD=./libinterpose_python.so cat a
sandbox_init()
open()
hi

Здесь это происходит один раз во время инициализации Python:

$ LD_PRELOAD=./libinterpose_python.so python
sandbox_init()
Python 2.7.2 (default, Jun 12 2011, 20:20:34) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
open()
>>> 
sandbox_fini()

Здесь этого вообще не происходит, и нет ошибки, указывающей на то, что у дескриптора файла были удалены права на запись:

$ LD_PRELOAD=./libinterpose_python.so python3 -c 'b = open("a", "w"); b.write("hi\n"); b.flush()'
sandbox_init()
sandbox_fini()

Код - здесь . Выполните сборку с помощью make -f Makefile.interpose_python .

Полное решение приведено здесь .

9
задан Community 23 May 2017 в 12:02
поделиться