Ich habe versucht, dem Online-Tutorial für Learn C The Hard Way zu folgen .
Nach dem Einrichten von valgrind (ich bin anderen Links gefolgt, die beim Einrichten von valgrind unter Ubuntu 12.04 helfen), stelle ich beim Versuch, die ausführbare Datei c zu debuggen, die folgenden Fehler fest.
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$
Kann ich etwas tun, damit Valgrind endlich funktioniert?
Ich habe Ubuntu 12.04 auf virtuelle Box. Mein Laptop ist ein Windows 7 64-Bit-Betriebssystem.
12.04
software-installation
programming
c
Ayusman
quelle
quelle
Antworten:
Ich habe im Wesentlichen die gleiche Nachricht erhalten (außer dass diese
ld-linux-x86-64.so.2
durch ersetzt wurdeld-linux.so.2
). Ich hatte Valgrind mitapt-get
libc6-dbg installiert, das bereits als Abhängigkeit enthalten war.Ich habe dies noch nicht vollständig gelöst, aber ein Hinweis ist, dass der Fehler mit meiner Verwendung
-m32
beim Erstellen korreliert .In meinem Fall scheint das Problem das Fehlen einer 32-Bit-Version von libc6-dbg (oder einiger seiner Komponenten) zu sein, wenn ich auf einer 64-Bit-Installation von Ubuntu 12.04 aufbaue.
Lösung (für meinen Fall)
Für mich hat der folgende Befehl funktioniert ...
Dies wird unter https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236 besprochen
Hinweis: Das Paket
libc6-dbg:i386
wird nicht als verfügbare Option in Synaptic oder per Befehl-Vervollständigung von angezeigtapt-get
- aber es war trotzdem da.quelle
:i386
ist der Schlüssel hier.libc6-dbg
wurde schon in der fehlermeldung angedeutetvalgrind
.Ok, ich habe intsall libc6-dbg so gemacht
und valgrind scheint gut zu funktionieren.
Danke an den Ubuntu Forum Link:
http://ubuntuforums.org/showthread.php?t=1017692
quelle
sudo apt-get install libc6-dbg:i386
könnte dies eine Lösung sein, die von der zu valgrindenden Binärdatei abhängt (64 Bit gegenüber 32 Bit).Ich hatte sehr lange damit zu kämpfen, das Kompilieren im -m32-Modus hat funktioniert, aber es war ein Ärgernis, und wenn ich zB -lcrypto verwenden wollte, konnte ich es nicht in -m32 kompilieren, da ich kein openssl in 32bit installiert hatte .
Also habe ich eine Menge ähnlicher Posts durchgelesen und normalerweise empfohlen, libc6-dbg zu installieren: i386 ... Ich denke, dies hat das Problem für -m32 gelöst, aber es war nicht das, wonach ich gesucht habe. Also nach langer Zeit kam ein: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html
Versuchen Sie also, dpkg -l libc6 * auszuführen, und wenn Sie libc6-amd64 sehen, könnte dies Ihnen helfen. Aber lesen Sie es sorgfältig vor allem. Punkt 2, weil Sie nach dem Entfernen des libc6-amd64-Pakets keine Befehle mehr verwenden können. Bereiten Sie also eine Live-CD vor und befolgen Sie die Anweisungen . Ich empfehle, Ihre Daten zu sichern, bevor Sie dies tun, denn wenn Sie versagen, wird es wahrscheinlich keinen Weg zurück geben.
Und sei vorsichtig bei Punkt 4! Sie können den dort vorgeschlagenen Befehl nicht einfach schreiben,
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2
da er eine symbolische Verknüpfung im Live-CD-/
Ordner herstellen würde. Außerdem müssen Sie über Root-Rechte verfügen, um in lib64 schreiben zu können. Also, wie ich es gemacht habe, war: (Ich hatte / Ordner auf meiner kaputten Valgrind-Diskette über das Live-CD-Terminal geöffnet)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
Hoffe, ich habe nichts vergessen und das wird hilfreich sein.
PS: Ich frage mich, ob es möglich ist, den Symlink zu ändern, bevor Sie das libc6-amd64-Paket entfernen (Sie würden das gesamte Live-CD-Zeug umgehen), aber ich bin nicht sicher.
quelle