Cra sh после двухкратного вызова .so из скрипта python - PullRequest
0 голосов
/ 03 марта 2020

У меня есть файл .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

Есть идеи, почему я получаю такое поведение?

...