El 29/09/10 14:30, Angel Guzman Maeso escribió:
Hola Angel!
Lo siguiente es solo una teoría, puede incluso que sea algo equivocado,
pero, podría ser que estuvieras cogiendo libc.so.6 de lib64/ en vez de
lib32?
No se exactamente si al hacer libc = CDLL('libc.so.6') coja la de 32
bits por estar en path de forma prefente.
Quizás poniendo la ruta completa a la biblioteca no te problemas (como
digo es solo una suposición).
Acabo de comprobar que el directorio '/lib64' es un enlace simbólico a
'/lib' y que el fichero 'libc.so.6' es un ELF de 64-bits. En cualquier
caso, he probado llamando a CDLL() con la ruta completa y el error es el
mismo:
$ strace -e trace=open ./malloc.py
open("/lib64/libc.so.6", O_RDONLY) = 3
OK: 1
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Como decía, la función malloc() vía ctypes está funcionando según lo
esperado y free() no, ¿no tengo forma de hacer debug para ver que puede
estar pasando?
Como curiosidad, *si hago un malloc() de un solo byte, free() si libera
la zona de memoria*, esto funciona con cantidades pequeñas
(concretamente el script falla al liberar 395.641 bytes, que no parece
coincidir con ningún límite conocido y/o exponencial de 2, etc), ejemplo:
In [1]: from ctypes import CDLL
In [2]: libc = CDLL('/lib64/libc.so.6')
In [3]: p = libc.malloc(1)
In [4]: libc.free(p)
Out[4]: 44791776
In [5]: p = libc.malloc(395641)
In [6]: libc.free(p)
Fallo de segmentación
Sigo investigando, muchas gracias por vuestra ayuda! :)
Saludos!
--
Santi Saez
http://woop.es
_______________________________________________
Python-es mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/