ctypes
по умолчанию предполагает, что все функции возвращают int
, что означает, что на 64-битной машине возвращенный указатель будет усечен до 32 бит, что приведет к его повреждению.
На всякий случай следует указать аргументы и типы результатов для каждой lib c вызываемой функции следующим образом:
from ctypes import *
libc.getpagesize.argtypes = []
libc.getpagesize.restype = c_int
libc.mmap.argtypes = [c_void_p, c_size_t, c_int, c_int, c_int, c_long]
libc.mmap.restype = c_void_p
libc.memcpy.argtypes = [c_void_p, c_void_p, c_size_t]
libc.memcpy.restype = c_void_p
libc.munmap.argtypes = [c_void_p, c_size_t]
libc.munmap.restype = c_int
С этими определениями типов ваш код работает правильно. Кроме того, он правильно проверяет все параметры и приводит к ним типы возвращаемых значений, поэтому вы можете удалить приведения к вызовам libc
.