/Linuxコマンド

開発ツール

バイナリとデバッグ

実行ファイルやライブラリの中身・依存関係を調べる ldd・nm・objdump・readelf と、動きを追う strace・gdb。

ldd依存している共有ライブラリ

実行ファイルがどの共有ライブラリ(.so)を使っているかを表示します。「ライブラリが見つからない」エラーの調査に使います。

bash
$ ldd /usr/bin/curl
$ ldd ./myapp | grep "not found"      # 足りないライブラリを探す

ldconfigライブラリの検索パスを更新する

新しく入れた共有ライブラリをシステムに認識させます。

bash
$ sudo ldconfig                 # /usr/local/lib などに入れたライブラリを認識させる
$ ldconfig -p | grep libssl     # 認識されているライブラリを探す

nmシンボル(関数名・変数名)の一覧

Ubuntu には最初から入っていません。 で入れられます。

実行ファイルやライブラリに含まれる関数名・変数名(シンボル)を一覧します。

bash
$ nm -C mylib.a | grep " T "    # 定義されている関数(-C で C++ の名前を読みやすく)
$ nm -D /usr/lib/x86_64-linux-gnu/libz.so.1 | head

objdump逆アセンブル・ヘッダーの表示

Ubuntu には最初から入っていません。 で入れられます。

実行ファイルを逆アセンブルしたり、ヘッダーやセクションを表示したりします。

bash
$ objdump -d -M intel ./hello | less     # 逆アセンブル(Intel 記法)
$ objdump -p ./hello | grep NEEDED       # 必要なライブラリ
$ objdump -h ./hello                     # セクションの一覧

readelfELF ファイルの情報

Ubuntu には最初から入っていません。 で入れられます。

Linux の実行ファイル形式(ELF)の中身を詳しく表示します。

bash
$ readelf -h ./hello           # ヘッダー(32/64bit、エントリーポイントなど)
$ readelf -d ./hello           # 動的リンクの情報
$ readelf -S ./hello           # セクション

size / strip / arサイズ・削減・静的ライブラリ

Ubuntu には最初から入っていません。 で入れられます。

実行ファイルの大きさの内訳を見たり、デバッグ情報を外して小さくしたり、静的ライブラリの中身を見たりします。

bash
$ size ./hello                 # text / data / bss の大きさ
$ strip ./hello                # デバッグ情報を外して小さくする
$ ar t libfoo.a                # 静的ライブラリの中身

hexdump16進数で表示する

ファイルの中身を16進数で表示します。

bash
$ hexdump -C file.bin | head   # 16進数と文字を並べて表示
$ hexdump -n 16 -C file.bin    # 先頭16バイト

pkg-configライブラリのコンパイルオプション

Ubuntu には最初から入っていません。 で入れられます。

ライブラリを使うプログラムをコンパイルするときに必要なオプションを教えてくれます。

bash
$ pkg-config --cflags --libs libcurl
$ gcc app.c $(pkg-config --cflags --libs libcurl) -o app
$ pkg-config --list-all | grep -i ssl

straceシステムコールを追いかける

プログラムがどのファイルを開こうとしているか、どこで止まっているかを調べるのに便利です。

bash
$ strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT   # 開いたファイル
$ strace -c ls                        # システムコールの集計
$ sudo strace -p 1234                 # 動いているプロセスにつなぐ
$ strace -e trace=network curl -s example.com >/dev/null

ltraceライブラリ関数の呼び出しを追いかける

Ubuntu には最初から入っていません。 で入れられます。

プログラムがどのライブラリ関数を呼んでいるかを追いかけます。

bash
$ ltrace -c ./app

gdbデバッガ

Ubuntu には最初から入っていません。 で入れられます。

プログラムを1行ずつ動かしたり、落ちた場所を調べたりするデバッガです。

bash
$ gcc -g -O0 app.c -o app     # デバッグ情報付きでコンパイル
$ gdb ./app
(gdb) break main              # ブレークポイント
(gdb) run arg1                # 実行
(gdb) next / step             # 1行進む / 関数の中に入る
(gdb) print var               # 変数を表示
(gdb) bt                      # 呼び出し履歴(クラッシュしたときに)
(gdb) quit
$ gdb -p 1234                 # 動いているプロセスにつなぐ

javaJava のプログラムを実行する

Ubuntu には最初から入っていません。 で入れられます。

Java で作られたプログラム(.jar)を実行します。

bash
$ java -version
$ java -jar app.jar
$ java -Xmx2g -jar server.jar nogui     # メモリの上限を指定

実行するだけなら JRE(openjdk-17-jre)、javac でコンパイルもするなら JDK(openjdk-17-jdk)を入れます。

perlテキスト処理のワンライナー

テキスト処理が得意な言語で、sed や awk の代わりにワンライナーでよく使われます。

bash
$ perl -pi -e 's/foo/bar/g' *.txt           # sed -i の代わり(Perl の正規表現が使える)
$ perl -ne 'print if /ERROR/' app.log
$ perl -MJSON::PP -e 'print encode_json({a=>1})'