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/

Responder a