64ビットバイナリなるlsコマンドなど、いとをかし。

apacheなどを4ギガ超のメモリを搭載しているマシンでグリグリ動かす場合とかは64ビットバイナリにしておくと大量のメモリを使えるので良さげやけど、そんなに多くないメモリの自宅サーバーで使う分には64ビットバイナリなど殆ど意味なんか無いだろう。
逆にライブラリの互換性の問題が出てきたりとかもあるので無難に32ビットでコンパイルしておくほうが良いような気がする。
仕事でSPARC上でコンパイルする場合、CFLAGSに”-xarch=v8″を追加してわざわざ32ビットアーキテクチャで決め打ち、何かの拍子に64ビットにならんようにするくらいである。
とは言っても、64ビットバイナリで動いているデーモンというだけでなんか気分が良いし、可能なら64ビットバイナリを生成したくなるのはヲタの性であるし、害の無い所で無駄に64ビットのlsやrmコマンドなどをつくってみるのも乙なものである。
更にコマンドをls64,rm64などとリネームしておけば無駄に恰好良さげで、「いとをかし」である。
早くも便利でもない逆にリスクのある自己満足こそヲタの真骨頂というところか。
と言う事で、ここからが本題、バイナリとプロセスが64ビットかどうかを調べる方法を書いてみる。


SparcやAMD64などのマシンで何かをコンパイルした後、ちゃんと64ビットバイナリが出来ているのか確認する場合、例えばopensslのバイナリが64ビットで動作するのかどうか知りたければ、fileコマンドを使って、

# file /usr/local/bin/openssl
/usr/local/bin/openssl: ELF 64-ビット MSB 実行可能 SPARCV9 バージョン 1[動的にリンクされています][取り除かれていません]

ってな出力を確認する。
コマンド単体で無く、既に動作しているプロセスに対する場合は、plddコマンドを使ってプロセスが使用しているライブラリを確認したり、pflagsコマンドでdata modelを確認したり、pmapでメモリのアドレス空間の大きさを見たりすると良いらしい。
例えばapacheの場合は、
/usr/bin/ps -ef|grep httpd
等としてプロセスIDを調べた後、
pdddの場合は、

# pldd 16497
16497: /usr/local/apache/bin/httpd
/usr/local/apache/libexec/libhttpd.so
/lib/sparcv9/libsocket.so.1
/lib/sparcv9/libnsl.so.1
/lib/sparcv9/libpthread.so.1
/lib/sparcv9/libthread.so.1
/lib/sparcv9/libc.so.1

sparcv9とかamd64のライブラリを使っていれば64ビット。
pflagsの場合は、

# pflags 16497
16497: /usr/local/apache/bin/httpd
data model = _LP64 flags = ORPHAN|MSACCT|MSFORK
/1: flags = ASLEEP pollsys(0xffffffff7ffff5d0,0x0,0xffffffff7ffff690,0x0)

data model が _LP64 なら64ビット。
pmapの場合は

pmap 16497
16497: /usr/local/apache/bin/httpd
0000000100000000 8K r-x– /usr/local/apache/libexec/libhttpd.ep
0000000100100000 8K rwx– /usr/local/apache/libexec/libhttpd.ep
0000000100102000 224K rwx– [ heap ]
~略

で、メモリアドレス空間が16進数で16桁なので64ビット(32ビットの場合は8桁)
って感じやね。
参考ページ(と言うか殆ど丸写し…):動作しているプロセスが、32 bit または 64 bit バイナリのどちらか?@やっぱり Sun がスキ!

コメントする

メールアドレスが公開されることはありません。

PAGE TOP