Staram się postępować zgodnie z samouczkiem online dla Learn C The Hard Way .
Jednak po skonfigurowaniu valgrind (skorzystałem z innych linków, które pomagają skonfigurować valgrind na Ubuntu 12.04), kiedy próbuję debugować plik wykonywalny c, znajduję następujące błędy.
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$
Czy jest coś, co mogę zrobić, aby Valgrind w końcu zadziałał?
Mam Ubuntu 12.04 na wirtualnym pudełku. Mój laptop to 64-bitowy system operacyjny Windows 7.
12.04
software-installation
programming
c
Ayusman
źródło
źródło
Odpowiedzi:
Dostałem w zasadzie ten sam komunikat (z wyjątkiem tego, że
ld-linux-x86-64.so.2
został zastąpiony przezld-linux.so.2
). Zainstalowałem Valgrind za pomocąapt-get
libc6-dbg, który był już uwzględniony jako zależność.Nie w pełni to rozwiązałem, ale wskazówka jest taka, że błąd koreluje z moim wykorzystaniem
-m32
podczas budowania.Wydaje się więc, że w moim przypadku problemem jest brak 32-bitowej wersji libc6-dbg (lub niektórych jej składników), podczas budowania na 64-bitowej instalacji Ubuntu 12.04.
Rozwiązanie (w moim przypadku)
Dla mnie następujące polecenie sprawiło, że wszystko działało ...
Omówiono to na stronie https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236
Uwaga: Pakiet
libc6-dbg:i386
nie pojawia się jako dostępna opcja w Synaptic lub po wykonaniu poleceniaapt-get
- ale i tak tam był.źródło
:i386
jest klucz.libc6-dbg
został już wskazany wvalgrind
komunikacie o błędzie.Ok, zrobiłem tak wewnątrz libc6-dbg
i valgrind wydaje się działać dobrze.
Dzięki linku do forum ubuntu:
http://ubuntuforums.org/showthread.php?t=1017692
źródło
sudo apt-get install libc6-dbg:i386
może być rozwiązaniem zależnym od walidowanego pliku binarnego (64 bity vs 32 bity).Zmagałem się z tym przez bardzo długi czas, kompilacja w trybie -m32 działała, ale to był problem w dupie, ponadto jeśli chciałem użyć np. -Lcrypto, nie mogłem skompilować w -m32, ponieważ nie miałem zainstalowanego openssl w 32-bitowym systemie .
Przeczytałem więc wiele podobnych postów, zwykle zalecając instalację libc6-dbg: i386 ... Myślę, że to rozwiązało problem dla -m32, ale nie tego szukałem. Po długim czasie doszło do tego: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html
Spróbuj uruchomić dpkg -l libc6 *, a jeśli zobaczysz libc6-amd64, może ci to pomóc. Ale przeczytaj to dokładnie esp. punkt 2, ponieważ po usunięciu pakietu libc6-amd64 nie będziesz mógł używać żadnych poleceń, więc przygotuj LiveCD i postępuj zgodnie z instrukcjami :) Pomogło mi to rozwiązać problem, ale zajęło mi to około 3 godzin i kilka chwil strachu . Zalecam wykonanie kopii zapasowej danych, zanim to zrobisz, ponieważ jeśli zawiedziesz, prawdopodobnie nie będzie możliwości powrotu.
I bądź ostrożny w punkcie 4! Nie można po prostu napisać sugerowanego tam polecenia,
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2
ponieważ utworzy ono symboliczne łącze w/
folderze Live CD . Musisz także mieć prawa roota, aby pisać na lib64. Więc jak to zrobiłem: (miałem / folder na moim uszkodzonym dysku valgrind otwartym przez 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
Mam nadzieję, że nic nie zapomniałem, a to będzie pomocne.
PS: Zastanawiam się, czy można zmienić dowiązanie symboliczne przed usunięciem pakietu libc6-amd64 (pominiesz cały materiał LiveCD), ale nie jestem pewien.
źródło