SlideShare a Scribd company logo
_rtld()
ソースコードリーディング
@kusabanachi
#start_printf
このスライドの概要
● NetBSD の動的リンカ、 ld.elf_so の
動的リンク処理のソースコードを調べました
● 対象は NetBSD-6.0.1
● ソースコードはスライドに貼れなかったので
別窓で表示します
では、ソースコードを読んでいきます
/src/libexec/ld.elf_so/rtld.c
スタート (rtld.c 366 ~ )
Elf_Addr
_rtld(Elf_Addr *sp, Elf_Addr relocbase)
● 引数はスタックポインタと
ld.elf_so の配置アドレス
● スタックに環境変数と補助ベクタが
積まれている状態
● この時点でメインプログラムと、 ld.elf_so が
メモリにマップされている
スタックから情報の取得 (rtld.c 413 ~ 477)
● 上位 2 ワードは戻り値を格納する
● argc 、 argv
● 環境変数 (env)
● 補助ベクタ (pAUX_xxxx)
動的リンカ自身の初期化 (rtld.c 479 ~ )
_rtld_init(
(caddr_t)pAUX_base->a_v,
(caddr_t)relocbase, execname);
● 私の環境では、第一と第二引数は同じ値
● rtld.c line275 へ
動的リンカ自身の初期化 (rtld.c 275 ~ )
● _rtld_objself に ld.elf_so の情報を格納する
● &_DYNAMIC は ld.elf_so の
.dynamic セクションのアドレスになっている
(どういう仕組みか不明)
● 297 行
_rtld_digest_dynamic(_rtld_path,
&_rtld_objself);
で .dynamic セクションを元に情報を取得していく
.dynamic からの情報取得 (headers.c 67 ~ )
● 固定長の情報が並んでいるので、
NULL までループして tag 毎の情報を
Obj_Entry 構造体に格納する
● 主に各セクションの相対アドレスや、
そのセクションのエントリ総数 (DT_xxSZ)
● .hash セクションは buckets と chains のアドレス
を格納しておく
● NEEDED は名前番号を取得。
リスト構造で格納
環境変数の適用 (rtld.c 491 ~ 558)
● _rtld_trust = 実 ID と実効 ID が一致
● ”LD_xxxx" と一致すれば後の処理に適用
( 一部 _rtld_trust が必要 )
●
hints ファイルの適用 (rtld.c 559 ~ )
● 559 行
_rtld_process_hints(execname,
&_rtld_paths, &_rtld_xforms,
_PATH_LD_HINTS);
● #define _PATH_LD_HINTS "/etc/ld.so.conf"
● ファイルが無いと何もしない
メインプログラムの初期化 (rtld.c 568 ~ )
● まだロードされていない場合
● この分岐を通る場合は未確認
● メインプログラムのファイルを mmap して、
先頭のプログラムヘッダから情報を
取得しているようだ
メインプログラムの初期化 (rtld.c 576 ~ )
● ロード済みの場合
● _rtld_objmain =
_rtld_digest_phdr(phdr, phnum, entry);
● phdr はプログラムヘッダのアドレス
プログラムヘッダから情報を取得する
プログラムヘッダからの情報取得
(headers.c 338 ~ )
● 対象オブジェクトの情報を格納する構造体を生成
● ヘッダ自身を指すエントリのアドレスと
プログラムヘッダのアドレスの差分が
obj->relocbase ( 私の環境では 0)
● .interp や .dynamic セクションのアドレスを得る
メインプログラム初期化続き (rtld.c 604 ~ )
● 動的リンカのパス名は
メインプログラムのインタプリタ名に変える
● メインプログラムも .dynamic から
他セクションの位置などの情報を取得する
NEEDED オブジェクトのロード
(load.c 292)
● .dynamic から得た NEEDED オブジェクトを
順にロードする
● const char *name =
obj->strtab + needed->name;
● 候補のパスから対象ファイルを探す
● 見つかったら mmap して、
.dynamic セクションから情報を得て、
_rtld_obj_tail につなげる
● libc.so.12 がロードされる
オブジェクトの再配置 (reloc.c 148)
Int
_rtld_relocate_objects(
Obj_Entry *first, bool bind_now)
● first から順に全オブジェクトについて処理する
● 185 行
_rtld_relocate_nonplt_objects(obj)
plt ではない object の再配置
● 196 行
_rtld_relocate_plt_lazy(obj)
plt の lazy な再配置
nonplt の再配置
(arch/i386/mdreloc.c 52)
● オブジェクトの rel を順に処理する
● タイプ( ELF_R_TYPE(rel->r_info) )毎に
処理が異なる
● R_TYPE(GLOB_DAT) は
rtld_find_symdef() でシンボルを探して
見つけたアドレスを指せるようにする
● R_TYPE(RELATIVE) は
別のオブジェクトを探す必要はなく、
相対アドレスに relocbase を加算した値を使う
plt の遅延配置のための準備
(arch/i386/mdreloc.c 180)
● pltrel が指した先のアドレスに relocbase を
加算しておく
init function の呼出し
(rtld.c 209)
● _rtld_initlist_tsort(&initlist, 0);
で各オブジェクトと NEEDED を全て
initlist につなげている
● initlist にあるオブジェクトについて、
obj->init があれば、コールする
おわり
(rtld.c 713)
● 元のスタックの先頭箇所に、
exit 関数のポインタと
メインプログラムの構造体のポインタを入れる
● obj->entry ( .text の開始位置)
を返して終わる

More Related Content

Similar to _rtld

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
t-sin
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介Ohsawa Goodfellow
 
InfiniBand on Debian
InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
Taisuke Yamada
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsuNanha Park
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
Kiwamu Okabe
 
Solr 4.0 の主な機能
Solr 4.0 の主な機能Solr 4.0 の主な機能
Solr 4.0 の主な機能Shinichiro Abe
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
do_aki
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
emasaka
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
鉄次 尾形
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
2012/03/31 Apacheスタートスクリプト読書会発表資料
2012/03/31 Apacheスタートスクリプト読書会発表資料2012/03/31 Apacheスタートスクリプト読書会発表資料
2012/03/31 Apacheスタートスクリプト読書会発表資料Yasutaka Hamada
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
鉄次 尾形
 
Apache spark 2.3 and beyond
Apache spark 2.3 and beyondApache spark 2.3 and beyond
Apache spark 2.3 and beyond
NTT DATA Technology & Innovation
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517akirahiguchi
 
Return Oriented Programming
Return Oriented ProgrammingReturn Oriented Programming
Return Oriented Programming
sounakano
 

Similar to _rtld (20)

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介
 
InfiniBand on Debian
InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
Nodejuku01 ohtsu
Nodejuku01 ohtsuNodejuku01 ohtsu
Nodejuku01 ohtsu
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
Solr 4.0 の主な機能
Solr 4.0 の主な機能Solr 4.0 の主な機能
Solr 4.0 の主な機能
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
2012/03/31 Apacheスタートスクリプト読書会発表資料
2012/03/31 Apacheスタートスクリプト読書会発表資料2012/03/31 Apacheスタートスクリプト読書会発表資料
2012/03/31 Apacheスタートスクリプト読書会発表資料
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
Apache spark 2.3 and beyond
Apache spark 2.3 and beyondApache spark 2.3 and beyond
Apache spark 2.3 and beyond
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
Return Oriented Programming
Return Oriented ProgrammingReturn Oriented Programming
Return Oriented Programming
 

_rtld