es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Habilitación de libasan (sanitizador de direcciones, enlazado dinámicamente) con gcc en AWS Linux 2.

Tengo un proyecto para el cual me gustaría habilitar el detector de direcciones durante las pruebas. Está siendo construido y probado en AWS Linux 2 y el compilador es gcc 7.3.1. Necesito tener libasan enlazado dinámicamente porque estoy probando un módulo de extensión de Python y el propio ejecutable de Python no se construye con asan.

Después de construir/enlazar mi código con -fsanitize=address, estoy iniciando Python (que cargará mi código) con LD_PRELOAD como /usr/lib/gcc/x86_64-redhat-linux/7/libasan.so. Esa es la ruta que obtengo de gcc -print-file-name=libasan.so (y he confirmado que existe).

Cuando corro, obtengo

ERROR: ld.so: object '/usr/lib/gcc/x86_64-redhat-linux/7/libasan.so' from LD_PRELOAD cannot be preloaded (file too short): ignored.

¿Por qué es esto? ¿Cómo hago para que se use libasan? ¿Necesito instalar un paquete adicional?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Linux, gcc, enlace dinámico, sanitización y address-sanitizer, entiendo el problema que está enfrentando al habilitar el address sanitizer durante las pruebas en AWS Linux 2. Según el mensaje de error que recibió, parece haber un problema con el tamaño del archivo /usr/lib/gcc/x86_64-redhat-linux/7/libasan.so. El error archivo demasiado corto podría significar que el archivo no tiene el tamaño esperado, posiblemente debido a dependencias faltantes o una instalación incompleta.

    Para resolver este problema, primero debe asegurarse de haber instalado las dependencias y paquetes necesarios para la biblioteca asan. Puede intentar ejecutar el comando yum install libasan para instalar la biblioteca y cualquier dependencia faltante. También puede intentar reinstalar el paquete gcc para asegurarse de que se hayan instalado correctamente todas las dependencias.

    Una vez que haya instalado las dependencias necesarias, debe confirmar que el archivo libasan.so existe en la ruta especificada ejecutando el comando ls /usr/lib/gcc/x86_64-redhat-linux/7/. Si el archivo existe y el problema persiste, puede intentar configurar la variable de entorno LD_DEBUG para obtener más información sobre el proceso de carga. Puede ejecutar el script de prueba de Python con LD_DEBUG=libs python test.py para obtener más información sobre las bibliotecas compartidas que se están cargando.

    Si el problema persiste, puede intentar compilar y enlazar su código con una versión diferente de gcc o intentar vincular estáticamente la biblioteca libasan en lugar de vincular dinámicamente. Además, puede intentar usar una herramienta diferente como valgrind para detectar errores de memoria en lugar del address sanitizer.

    En general, podría haber varias razones por las que la biblioteca libasan no se está cargando correctamente, pero siguiendo estos pasos, debería poder resolver el problema y habilitar el address sanitizer durante las pruebas en AWS Linux 2 con gcc 7.3.1.

Comments are closed.