У меня есть файл .so с простой функцией, возвращающей число * 2. Этот файл .so находится в архиве .zip. Из сценария python я пытаюсь извлечь файл .so во временную папку и выполнить из него функцию. Проблема в том, что во второй раз, когда я пытаюсь это сделать, я получаю ошибку сегментации.
Это, вероятно, яснее из кода, поэтому вот примеры, которые я пробовал:
Случай I - сбой
import ctypes
import zipfile
import tempfile
def foo():
archive = zipfile.ZipFile("test.zip")
lib_path = archive.extract("secret.so", tempfile.gettempdir())
archive.close()
secret = ctypes.CDLL(lib_path)
print(secret.secret_calculation(3))
foo()
foo() # <--- SegFault when calling secret.secret_calculation
Случай II - рабочий (извлечение в разные папки каждый раз)
import ctypes
import zipfile
import tempfile
def foo():
archive = zipfile.ZipFile("test.zip")
lib_path = archive.extract("secret.so", tempfile.mkdtemp()) # <--- mkdtemp creates a new folder every time
archive.close()
secret = ctypes.CDLL(lib_path)
print(secret.secret_calculation(3))
foo()
foo() # <--- NO SegFault
Случай III - работающий (загрузка так без вызова в него)
import ctypes
import zipfile
import tempfile
def foo():
archive = zipfile.ZipFile("test.zip")
lib_path = archive.extract("secret.so", tempfile.gettempdir())
archive.close()
secret = ctypes.CDLL(lib_path)
# print(secret.secret_calculation(3))
foo()
foo() # <--- NO SegFault
Случай IV - работа (вызов в .so дважды, без извлечения сначала)
import ctypes
import zipfile
import tempfile
def foo():
# archive = zipfile.ZipFile("test.zip")
# lib_path = archive.extract("secret.so", tempfile.gettempdir())
# archive.close()
secret = ctypes.CDLL("/tmp/secret.so")
print(secret.secret_calculation(3))
foo()
foo() # <--- NO SegFault
Python версия: 2.7.12
Есть идеи, почему я получаю такое поведение?