He estado tratando de seguir el tutorial en línea para Learn C The Hard Way .
Sin embargo, después de configurar valgrind (seguí otros enlaces que ayudan a configurar valgrind en ubuntu 12.04), cuando intento depurar el ejecutable c, encuentro los siguientes errores.
ayusman@ayusman-ubuntu:~/lcthw$ valgrind ./ex4
==1984== Memcheck, a memory error detector
==1984== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==1984== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==1984== Command: ./ex4
==1984==
valgrind: Fatal error at startup: a function redirection
valgrind: which is mandatory for this platform-tool combination
valgrind: cannot be set up. Details of the redirection are:
valgrind:
valgrind: A must-be-redirected function
valgrind: whose name matches the pattern: strlen
valgrind: in an object with soname matching: ld-linux-x86-64.so.2
valgrind: was not found whilst processing
valgrind: symbols from the object with soname: ld-linux-x86-64.so.2
valgrind:
valgrind: Possible fixes: (1, short term): install glibc's debuginfo
valgrind: package on this machine. (2, longer term): ask the packagers
valgrind: for your Linux distribution to please in future ship a non-
valgrind: stripped ld.so (or whatever the dynamic linker .so is called)
valgrind: that exports the above-named function using the standard
valgrind: calling conventions for this platform. The package you need
valgrind: to install for fix (1) is called
valgrind:
valgrind: On Debian, Ubuntu: libc6-dbg
valgrind: On SuSE, openSuSE, Fedora, RHEL: glibc-debuginfo
valgrind:
valgrind: Cannot continue -- exiting now. Sorry.
ayusman@ayusman-ubuntu:~/lcthw$
¿Hay algo que pueda hacer para que valgrind finalmente funcione?
Tengo ubuntu 12.04 en la caja virtual. Mi laptop es un sistema operativo Windows 7 de 64 bits.
12.04
software-installation
programming
c
Ayusman
fuente
fuente
Respuestas:
Recibí esencialmente el mismo mensaje (excepto que
ld-linux-x86-64.so.2
fue reemplazado porld-linux.so.2
). Había instalado Valgrind usandoapt-get
libc6-dbg ya estaba incluido como una dependencia.Todavía no he resuelto completamente esto, pero una pista es que el error se correlaciona con mi uso de
-m32
cuando construyo.Entonces parece que, en mi caso, el problema es la falta de una versión de 32 bits de libc6-dbg (o algunos de sus componentes), cuando se construye en una instalación de Ubuntu 12.04 de 64 bits.
Solución (para mi caso)
Para mí, el siguiente comando hizo que las cosas funcionaran ...
Esto se discute en https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236
Nota: El paquete
libc6-dbg:i386
no se muestra como una opción disponible en Synaptic o mediante la finalización de comandosapt-get
, pero estaba allí de todos modos.fuente
:i386
es la clave aquí.libc6-dbg
ya estaba insinuado envalgrind
el mensaje de error de.Ok, hice intsall libc6-dbg así
y valgrind parece funcionar bien.
Gracias al enlace del foro de ubuntu:
http://ubuntuforums.org/showthread.php?t=1017692
fuente
sudo apt-get install libc6-dbg:i386
podría ser una solución dependiendo del binario que se va a valorar (64 bits frente a 32 bits).Luché con esto durante mucho tiempo, compilar en modo -m32 funcionó, pero fue un fastidio, además, si quisiera usar, por ejemplo, -lcrypto, no podría compilar en -m32 ya que no tenía openssl en 32 bits instalado .
Así que leí muchas publicaciones similares, generalmente aconsejando instalar libc6-dbg: i386 ... Creo que esto resolvió el problema para -m32, pero no era lo que estaba buscando. Entonces, después de mucho tiempo, llegó a esto: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html
Intente ejecutar dpkg -l libc6 * y si ve libc6-amd64, esto podría ayudarlo. Pero léalo cuidadosamente esp. punto 2, porque no podrá utilizar ningún comando después de eliminar el paquete libc6-amd64, así que prepare un liveCD y siga las instrucciones :) Me ayudó a resolver el problema, pero me llevó unas 3 horas y un par de momentos de miedo . Recomiendo hacer una copia de seguridad de sus datos antes de hacerlo, porque si falla, probablemente no habrá vuelta atrás.
¡Y ten cuidado en el punto 4! Simplemente no puede escribir el comando sugerido allí
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2
porque haría un enlace simbólico en la/
carpeta de CD en vivo . También debe tener derechos de root para escribir en lib64. Entonces, cómo lo hice fue: (tenía / carpeta en mi disco valgrind roto abierto a través del terminal liveCD)1)
sudo rm ./lib64/ld-linux-x86-64.so.2 //removing old link
2)
sudo ln -s /lib/x86_64-linux-gnu/ld-2.17.so ./lib64/ld-linux-x86-64.so.2
//you refer to the file on the disk with broken linux, but if you wrote just / instead of ./ you would create the link in the liveCD / folder
Espero no haber olvidado nada y esto será útil.
PD: Me pregunto si es posible cambiar el enlace simbólico antes de eliminar el paquete libc6-amd64 (omitiría todo el contenido del liveCD), pero no estoy seguro.
fuente