Привет,
Я пытаюсь изменить поведение zlib и test, поэтому я написал mylib.c
и mylib.h
. Это создает оболочку для вызова функций zlib внутри (например, InflateInit2()
). Я компилирую/связываю со следующими командами:
gcc -g -Wall -Werror -c -std=c99 -I./zlib-1.2.5 -I./ -fPIC mylib.c
gcc -shared mylib.o -o mylib.so
Затем я импортирую его в python, используя:
mylib = cdll.LoadLibrary(os.getcwd() + '/mylib.so')
Мне нужна версия zlib, отличная от той, которая была установлена в моей системе, поэтому я загрузил и скомпилировал другой источник из источника (установка его на моей системе сделала ее нестабильной). Проблема, с которой я сталкиваюсь сейчас, заключается в том, что внесение изменений в файлы с исходным кодом zlib не отражается при использовании mylib в python. Python (или, возможно, мой метод компиляции mylib.so
) должен использовать системную версию zlib. Есть ли способ указать "правильную" версию zlib.so.
Я полагаю, что исходный код Python статически связан с объединенной копией zlib. Чтобы использовать Python для использования вашей версии, вам, вероятно, потребуется загрузить источник Python и создать собственный интерпретатор с измененным исходным кодом zlib.
# system python static lib bundles the zlibmodule.o code
ares% nm -ao /usr/lib/libpython2.6.a|grep initzlib
/usr/lib/libpython2.6.a:zlibmodule.o:0000000000000000 T initzlib
Обновлено: Спасибо за дополнительную информацию, я вижу, что вы пытаетесь сделать.
Обломок пользовательского zlib в общем объекте не будет работать, как вы обнаружили. Что вам нужно сделать, так это вызвать пользовательские функции zlib напрямую через дескриптор разделяемого объекта, возвращенный cdll.LoadLibrary()
. Вам понадобится макет структуры z_stream
путем расширения ctypes.Structure
.
Частичный пример, который должен вас поймать:
from ctypes import *
class z_stream(Structure):
_fields_ = [
('next_in', c_char_p),
('avail_in', c_uint),
('total_in', c_ulong),
# finish adding all fields in the z_stream struct..
]
stream = z_stream()
zlib = cdll.LoadLibrary('./zlib-1.2.5/libz.so.1')
ret = zlib.deflateInit_(stream, 1, "1.2.5", sizeof(stream))
print ret