Learn C The Hard Way のオンラインチュートリアルに従うことを試みました。
ただし、valgrindをセットアップした後(ubuntu 12.04でvalgrindのセットアップに役立つ他のリンクをたどった)、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$
最終的にvalgrindを機能させるためにできることはありますか?
仮想ボックスにubuntu 12.04があります。私のラップトップはWindows 7 64ビットOSです。
OK
Sudo apt-get install libc6-dbg
valgrindはうまく機能しているようです。
Ubuntuフォーラムのリンクに感謝します。
本質的に同じメッセージを受け取りました(ld-linux-x86-64.so.2
がld-linux.so.2
に置き換えられたことを除いて)。 apt-get
を使用してValgrindをインストールしたため、libc6-dbgは既に依存関係として含まれていました。
私はまだこれを完全には解決していませんが、手掛かりは、エラーがビルド時の-m32
の使用と相関していることです。
したがって、私の場合、Ubuntu 12.04の64ビットインストールでビルドする場合、問題はlibc6-dbg(またはそのコンポーネントの一部)の32ビットバージョンが不足しているように見えます。
私にとって、次のコマンドは物事を機能させました...
Sudo apt-get install libc6-dbg:i386
これは https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236 で説明されています
注:パッケージlibc6-dbg:i386
は、Synapticまたはapt-get
のコマンド補完を介して利用可能なオプションとして表示されませんが、とにかく存在していました。
私はこれに非常に長い間苦労しました-m32モードでコンパイルすることはうまくいきましたが、さらに、たとえば-lcrypto、32ビットのopensslがインストールされていないため、-m32でコンパイルできませんでした。
だから私は通常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
は、ライブcd /
フォルダーにシンボリックリンクを作成するためです。また、lib64に書き込むにはルート権限が必要です。だから私はそれをやった:(liveCDターミナルから開いた壊れたvalgrindディスク上の/フォルダーを持っていた)
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
何も忘れずに、これが役立つことを願っています。
追伸:libc6-AMD64パッケージを削除する前にsymlinkを変更することは可能だろうか(liveCDの内容全体をバイパスするでしょう)が、よくわかりません。