GNU tools

since: 2004-05-19 update: 2004-05-19 count:

主に問題を解決する観点から GNU の素晴しい開発ツール群を始めとする 開発ツールについて書き並べてみました。

基本的なもの

さすがに ls とかは省略。 シェル、仮想端末、 X 、エディタ、ブラウザ、メーラ、 make 、スクリプト言語なんかも当然として…

プロセス管理

以下の他にも /proc (Linux では) に注目すると良い。

ps

ps -auxww | grep

までエイリアス。

書いている最中に気付いたが、

psg() { ps -auxww | grep -E "(USER|$@)" }

とすると便利だ。

pstree

とても見やすくて良い。

kill

killall で大体十分だと思う。

killall

コマンド名指定で殺せる kill。

top

CPU 負荷などを見る。 top が top に来る。

ファイル探索

find

素直に zsh 使っとけ。

find . -type f -name *.d -exec rm {} \;

rm **/*.d(.)

がだいたい等価。 前者も書けた方がコマンドライン引数の限界に達した時に なんとかなる分少し良いかもしれない。

locate

updatedb でファイルシステム全体のデータベースを作っておく。 非常に高速にファイルシステム全体を走査できるので便利。 updatedb は cron などで定期的にしないと意味が無い。

rpm

私はこれしか知らないんですが、 ディストリビューション/OS ごとにこれに類するものがあるはず。

ソラでできなきゃ困ると思うこと。

パッケージ名から情報を得る。

rpm -qi binutils

パッケージ名からパッケージのリストを得る。

rpm -qil binutils

パッケージ名から依存関係を得る。

rpm -qiR binutils

ファイル名から上記を得る。

rpm -qif =nm # zsh

パッケージから上記を得る。

rpm -qip binutils*

パッケージ名一覧

rpm -qa

インストール

rpm -ihv binutils*

アンインストール

rpm -e binutils

ディストリビューションの rpm を全部集めたディレクトリで、

rpm -qipl * > rpms

などとしておくと便利かも。

.src.rpm は --rebuild, .spec は -ba 。

binutils

バイナリ関係の調べものに何かと役に立つものたち。 人様のソフトウェアで発生した問題の解決に役立つこともしばしば。

鵜飼さんの文章はとてもためになる。

nm

シンボルの一覧を得るコマンド。 よくわからない undefined reference は このコマンドを使うことによって 適切なライブラリを発見できることが多い。

出力は、シンボルのアドレス、タイプ、シンボル名と出る。 タイプは U が未定義、 T が定義済み。 その他もだいたい定義済み。 小文字だとローカルなシンボル。

C++ のシンボルは mangling されていて意味がわからんので 後述の c++filt にパイプで渡す。

nm -o でファイル名も表示。これは欲しいシンボルを持つファイルを探す時に、

nm -o /usr/lib/*.a | grep finding_function

などとすればリンクすべきライブラリがわかる。

nm -l でソースの情報がある場合は そのシンボルの定義位置をファイル名と行数で表示。

c++filt

意味のわからん C++ のシンボルを読みやすくする。

objdump

オブジェクトファイルの情報を得る。 私の場合たいていは逆アセしたいだけなので、

objdump -S hello

で事足りている。

とにかくいろんな情報を得られるので詳しくは man 。

readelf

objdump の友達。よく知らないので毎回 man を見ます。

ar

アーカイブをいじるソフト。 たいていはたくさんの .o ファイルを .a ファイルに まとめるために使うと思う。

ar cru libhoge.a *.o

などと。その後は後述の ranlib を使う。

ranlib

ar だけではダメな環境では

ranlib libhoge.a

とおまじないしておくと良い。 やっておいて損は無いので ar とセットで。

ar s と等価なので ar crus などとしても良いらしい。

as

アセンブラ。 gcc から呼ばれる。

ld

リンカ。 gcc から呼ばれる。

strings

バイナリから文字列を抽出します。 よくわからんファイルに使ったりします。

strip

シンボル情報などを取り除いてバイナリを小さくしてくれます。

strip --strip-unneeded なら dll も安心。

gprof

プロファイラ。 gcc で -pg オプションをつけてコンパイルし、 実行した後に実行ファイルに対して

gprof hello

などと。

その他

LD_ 環境変数

どこに書いたものやらとこのへんに。 LD_LIBRARY_PATH, LD_PRELOAD, LD_DEBUG あたりが便利か。

ldd

Linux では /lib/ld-linux.so.2 --list と同義、かな? 実行ファイルや共有オブジェクトがどの共有オブジェクトに 依存しているかどうかを調べます。 すごく便利。

MacOSX では otool -L

strace

第一引数を実行し、その際呼ばれたシステムコールを全て表示する。 -f で子プロセスもやってくれる。 -t, -tt で時間表示。 -c, -T で簡易プロファイル。

エラーメッセージ無しで落ちるものも strace してみると、

open("save/key.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

などという行が見つかったりしてああこのファイルが無いのだな、とわかる。

cygwin では今一つな結果が得られる。

hexdump

hexdump -C が定番か。

expect

echo password | ssh root@localhost ls

などとしてがっかりした場合は調べてみると良いかと。

オリジナルは Tcl らしいがスクリプト言語には大抵あるのでお好みで。

gcov

カバレッジを計るツール。 gcc で -fprofile-arcs -ftest-coverage を付けて、 後は gprof と似たようなもの。

gdb

デバッガ。詳しく記すには余白は狭すぎる。

r, where, b, c, p, n, s, l, i, x 位は知っていると良いのかな。

gcc

いよいよ本懐。

最適化するときは -O, -O2, -f* 、 デバッグする時は -g 、 警告は -W, -Wall あたりで、 プロファイリングは -pg 、 ansi な自信があれば -ansi -pedantic 。

gcc -v で何が起こっているか教えてくれるらしいが便利ではない。 以下のようなフェーズがある。

プリプロセス

gcc -E でプリプロセスのみ行うことができる。 -dM もつければ定義されたマクロ一覧が得られる。

インクルードパスを通すのは -I 、 -DHOGE=1 で #define HOGE 1 と同様の効果。

デフォルトでは cc1 が行う。 cpp を使うように指定したりもできたはず。

コンパイル、アセンブル (ソース→オブジェクト)

gcc -c でコンパイル、アセンブルと行う。

コンパイルは cc1 の役目。 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/cc1 などにあるはず。

他の言語なら cc1plus など、同じディレクトリにそれっぽいものがある。

アセンブルは as の役目。 binutils にある。

コンパイル (ソース → RTL)

RTL というのはいろんなアーキテクチャを吸収する 抽象的なアセンブラ言語みたいなもの。 巨大な lisp 表記で見てもわけがわからない。 通常ファイルには書き出さないが、 -dr で吐き出せる。

コンパイル (RTL 最適化)

この段階で既に言語に依存していないので、 言語実装者は gcc の最適化にかなり頼ることができるわけ。

途中の出力は -d? でいろいろと書き出せるが 依然として意味がわからない。

コンパイル (RTL → アセンブラ)

as などが読むためのアセンブラコードを一時ファイルに書き出す。 この部分は言語に依存していないので、 新しいハードウェアに対応させた時点でいろんな言語が使えるようになるし、 言語実装者にとっては色んな環境で動くようになる。 (ランタイムライブラリの環境依存を解決しなければならないが…)。

gcc ソース内の i386.md などを見ると頭が痛くなる。

アセンブル

特に無し。

リンク

/lib や /usr/lib なんかに ファイル libhoge.so.2 なんていうファイルがあったとして、 これをリンクする時は -lhoge 。 パスを増やす場合は -L 。

この時のエラーは慣れない人は苦労するようだ。 binutils を知れば自然と苦労しなくなるはず。


home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h