Я пытался следовать онлайн-учебнику для Learn C The Hard Way .
Однако после настройки valgrind (я перешел по другим ссылкам, которые помогают настроить valgrind в ubuntu 12.04), когда я пытаюсь отладить исполняемый файл c, я нахожу следующие ошибки.
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$
Есть ли что-то, что я могу сделать, чтобы Вальгринд наконец заработал?
У меня Ubuntu 12.04 на виртуальной коробке. Мой ноутбук - 64-битная ОС Windows 7.
12.04
software-installation
programming
c
Ayusman
источник
источник
Ответы:
Я получил по существу то же самое сообщение (кроме того, что
ld-linux-x86-64.so.2
было заменено наld-linux.so.2
). Я установил Valgrind, используяapt-get
libc6-dbg как зависимость.Я еще не полностью решил это, но подсказка в том, что ошибка связана с моим использованием
-m32
при сборке.Так что может показаться, что в моем случае проблема заключается в отсутствии 32-разрядной версии libc6-dbg (или некоторых ее компонентов) при сборке 64-разрядной версии Ubuntu 12.04.
Решение (для моего случая)
Для меня следующая команда заставила вещи работать ...
Это обсуждается на https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236
Примечание. Пакет
libc6-dbg:i386
не отображается в качестве доступного параметра в Synaptic или при завершении командыapt-get
- но он все равно был.источник
:i386
является ключевым здесь.libc6-dbg
было уже намекается вvalgrind
сообщении об ошибке.Хорошо, я сделал intsall libc6-dbg вот так
и Вальгринд, кажется, работает нормально.
Благодаря ссылке на форум Ubuntu:
http://ubuntuforums.org/showthread.php?t=1017692
источник
sudo apt-get install libc6-dbg:i386
может быть решением в зависимости от исполняемого двоичного файла (64 бита против 32 бита).Я боролся с этим очень долго, компиляция в режиме -m32 работала, но это было неприятно, более того, если бы я хотел использовать, например, -lcrypto, я не смог бы скомпилировать в -m32, так как у меня не было openssl в 32-битной системе. ,
Поэтому я прочитал много подобных сообщений, обычно советуя установить libc6-dbg: i386 ... Я думаю, что это решило проблему для -m32, но это было не то, что я искал. Итак, через некоторое время к этому пришло: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html
Поэтому попробуйте запустить dpkg -l libc6 *, и если вы видите libc6-amd64, это может вам помочь. Но прочитайте это внимательно, особенно. пункт 2, потому что вы не сможете использовать какие-либо команды после удаления пакета libc6-amd64, поэтому подготовьте liveCD и следуйте инструкциям :) Это помогло мне решить проблему, но заняло у меня около 3 часов и пару моментов страха , Я рекомендую сделать резервную копию ваших данных, прежде чем вы это сделаете, потому что, если вы потерпите неудачу, пути назад не будет.
И будьте осторожны в пункте 4! Вы не можете просто написать предложенную здесь команду,
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2
потому что она создаст символическую ссылку в/
папке live cd . Также вы должны иметь права root для записи в lib64. Итак, как я это сделал: (у меня была папка / на моем сломанном диске valgrind, открытом через терминал 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
Надеюсь, я ничего не забыл, и это будет полезно.
PS: Интересно, можно ли изменить символическую ссылку перед удалением пакета libc6-amd64 (вы бы пропустили весь материал liveCD), но я не уверен.
источник