2011-09-21 17 views
6

Tengo un controlador de prueba vinculado a una biblioteca que escribí. La biblioteca usa autotools para que produzca un archivo (archivo .a) y una biblioteca dinámica (.so).Valgrind errors when linked with -static - Why?

Cuando vinculo mi controlador con 'g ++ -static', supuestamente enlazando con .a, valgrind se enciende quejándose repetidamente 'Salto condicional o movimiento depende de valor (es) sin inicializar'. La primera falla ocurre antes de main en __pthread_initialize_minimal.

Cuando establezco un enlace sin -estático, supuestamente enlazando con .so, no recibo ninguna queja de valgrind.

¿Alguien sabe por qué? ¿Valgrind simplemente no funciona con -estático?

ACTUALIZACIÓN: No puedo publicar incluso una versión pelado abajo de mi conductor ya que se vincula a una biblioteca muy grande que no podía posible recortar, pero noto que más simple de todos los programas

int main() 
{ 
    return 0; 
} 

da un error cuando se vincula con -static y se ejecuta desde valgrind:

==15449== Use of uninitialised value of size 8 
==15449== at 0x40B0F3: exit (in /home/jdgordo/src/t) 

debería haber incluido que estoy corriendo en 64 bits RedHat 5.5.

+0

intente reducir el problema al código de código de líneas lo más posible y publicar aquí. – fazo

+4

Hay muchas fallas y accesos directos en las distintas bibliotecas del sistema, por lo que no es raro ver las que aparecen en valgrind. Podría intentar ignorarlos sistemáticamente, supongo, o simplemente hacer las pruebas con la versión compartida. –

+0

No veo esto en mi sistema. @KerrekSB - es correcto, no es realmente algo de lo que preocuparse y valgrind se envía con un archivo grande que suprime la mayoría de estos. Probablemente sea un poco incompatible con tu versión de libc/compilador en tu sistema de alguna manera. – Flexo

Respuesta

10

¿Valgrind no funciona con -static?

Lo hace. El problema no está en Valgrind, está en glibc, que no es Valgrind limpio. Los desarrolladores de glibc se negaron a solucionar estos problemas (porque los problemas son de naturaleza "no me importa" y arreglarlos cuesta (unos pocos) ciclos).

Cuando se vincula dinámicamente, estos errores provienen del libc.so.6, y se pueden suprimir fácilmente, que es lo que Valgrind realiza de forma predeterminada.

Pero cuando se vincula estáticamente, estos errores provienen de su ejecutable (que ahora incluye código de libc.a), por lo que las supresiones de Valgrind predeterminadas no los suprimen.

Puede escribir nuevas supresiones (consulte Valgrind --gen-suppressions=yesdocumentation).

O podría instalar y usar glibc-audit.

+0

¿Valgrind interceptará malloc y llamadas gratuitas cuando libc esté vinculado de forma estática? –

1

Si la biblioteca causa problemas en valgrind, solo puede ignorar esos problemas por writing suppression files.

Uno de los problemas que se encontraron con algo alocating en el montón, así:

// library 
int * some = new int; 

// main links the library 
int main() 
{ 
} 

Este ejemplo podría notificar un error sobre fuga.

EDITAR: si tiene el origen de la biblioteca, puede corregir el error (uso de la variable no inicializada) y recompilarlo.