2014年5月3日 (土曜日)

17:14:28 # Life dl_iterate_phdrと戯れる. 現在ロードされている共有ライブラリの一覧を取得できる。 コールバックはdl_phdr_info 経由でELFのプログラムヘッダにアクセスできるというELFがちがちなインタフェース。 手元で試してみたら一番目がメインのバイナリで二番目がVDSOっぽくて、 メインのバイナリのdlpi_name は空文字列がかえってくる。 二番目はVDSOなんだけど、なんかglibc 2.13では名前がうまくとれない。 glibc 2.18 では linux-vdso.so.1 という名前を取得してくれる。 dlpi_addr が 7fff0a4ff000 で dlpi_phdr[].p_vaddr が ffffffffff700548 なのでアドレスを見るとなにかがおかしいのがわかるんだけど、アドレスが不正なのでPT_DYNAMICなヘッダを読み込もうとすると segv することになる、のかな。 このアドレスを読むと死ぬのでそれまでのところで発見する必要があるっぽいんだけど、VDSOのアーキテクチャだと二番目に来るという以外になんか特徴あるのかね。 手元のkernel は stable なので 3.2.0、結構古い。 VDSOはカーネル内部で適当にでっち上げたヘッダなのでまぁこわれているということもあるだろうなという印象なんだけど、こわれているのは困るなぁ。 vdso って x86_64 限定のしくみなのかなと思っていたらいろんなアーキテクチャで使われていた。vdso(7) はけっこういい入門かも。 あとそこから参照されている linux/Documentation/vDSO/あたりも。 /proc/X/maps をみると 7fff0a4ff000 には vdso, ffffffffff700548 には vsyscall がマップされていることになってる。

17:44:11 # Life gasでx86_64 用のコードを書くのに必要なドキュメントとは。 多分見る必要があるドキュメントとして、まず命令セットの理解が必要だと思うので、 Intel(R) 64 and IA-32 Architectures Developer's Manual。 あとは System V Application Binary Interface AMD64 Architecture Processor Supplementで関数呼び出し規約を確認。 x86 の呼び出し規約はスタック使いまくりなんだけどx86_64はレジスタ呼び出しが基本なのでそこらへんをじっくりと味わう感じで。 で、gasの記法は独特なところがあるので info をよむのがよいでしょう。 Debian だと binutils-doc パッケージ info as タイトルがすごくあっさりしていて"Using as"、 Machine Dependent Features を中心にながめればよいきがする。 入門するときに基本的な記法がまったくわからないので、g++ -g -S でC++をコンパイルしてその出力をながめるというのがよいかも。 あと gdb で stepi/nexti してアセンブリ命令一命令ごとに実行しながら GUD で M-x gdb-display-registers-bufferM-x gdb-display-assembly-buffer しているのがよいきがする。

Junichi Uekawa

$Id: dancer-diary.el,v 1.94 2009/10/21 14:02:48 dancer Exp $