Использование другой версии zlib.so, чем в системе с использованием импорта Python cdll

1

Привет,

Я пытаюсь изменить поведение 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.

Теги:
shared-libraries

1 ответ

1

Я полагаю, что исходный код 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
  • 0
    Вы правы в этом отношении, но я собирался связать мою копию libz с mylib.so, используя mylib в качестве оболочки для настроенного libz. Я хотел сохранить свои настроенные варианты использования zlib для использования в других проектах C, python просто используется, чтобы я мог быстро и легко написать тесты для функций C. Также редактирование вопроса, чтобы сделать это более понятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню