2009年11月24日火曜日

【Linkers&Loaders】6 ライブラリ 〜サンプルでみるLinuxのライブラリ(私家版)〜

本書では、ライブラリの構造以外に、作成・検索・weak外部シンボルのお話などがある。
ここでは、Linuxにて、ELFオブジェクトファイルを使ったarライブラリを眺めてみる。


**** サンプルでみるLinuxのライブラリ(私家版)
- まずここでは静的にリンクするライブラリを扱う。
- すると基本的にはarで固めてある。
- /usr/lib/libc.aを対象に調べてみよう。
- まず、ar形式ファイルは"!<arch>\n"で始まる。

lib $ od -tx1 -c -N 8 libc.a
0000000 21 3c 61 72 63 68 3e 0a
! < a r c h > \n
0000010
lib $

- これ以降はarメンバが連なる。arメンバは、基本的
にオブジェクトファイルである。ただしすぐ見るよ
うにライブラリディレクトリ情報が例外として含ま
れる。
- 各arメンバは先頭に60Bのヘッダを持つ。
- Linuxにて、ELFライブラリとしてar形式を使う場合、
第一メンバの名前は"/"であり、ライブラリのディレ
クトリ情報を保持する。ヘッダの最後は、"`\n"とな
る。

lib $ od -tx1 -c -N 68 libc.a
0000000 21 3c 61 72 63 68 3e 0a 2f 20 20 20 20 20 20 20
! < a r c h > \n /
0000020 20 20 20 20 20 20 20 20 31 32 33 33 32 35 31 38
1 2 3 3 2 5 1 8
0000040 31 34 20 20 30 20 20 20 20 20 30 20 20 20 20 20
1 4 0 0
0000060 30 20 20 20 20 20 20 20 35 36 30 37 32 20 20 20
0 5 6 0 7 2
0000100 20 20 60 0a
` \n
0000104
lib $

- このヘッダの構造をみてみると、すべて単なる文字
列となっている。headで見てみる。

lib $ head -c 68 libc.a
!<arch>
/ 1233251814 0 0 0 56072 `
lib $

- これの解釈は次のとおり。

/ 1233251814 0 0 0 56072 `
012345678901234567890123456789012345678901234567890123456789
| | | | | | +--終端の"`\n"
| | | | | +--メンバサイズ[バイト](10B)
| | | | +--8進ファイルモード(8B)
| | | +--グループID(6B)
| | +--ユーザID(6B)
| +--修正日時[1970/1/1T00:00:00からの秒数](12B)
+--メンバ名(16)

- すきまは空白文字(0x20)でパディングされている。
- さて、arのメンバヘッダの形式がこういうものだとす
ると、16文字よりも長い名前をもつ要素はどうする
か。

- これは、"/"メンバの次のメンバとして"//"という名
前のメンバをつくり、そこに格納するルール。調べ
てみる。"/"メンバのサイズは56072Bなので、その後
の60Bが次のメンバのヘッダ。

libc-anatomy $ tail -c +56141 libc.a | head -c 60
// 1712 `
libc-anatomy $

- 1772Bなので、そこまで見てみる。

libc-anatomy $ tail -c +56141 libc.a | head -c 1772
// 1712 `
lc-measurement.o/
lc-identification.o/
C-identification.o/
__start_context.o/
isoc99_vfscanf.o/
isoc99_vsscanf.o/
printf-parsemb.o/
printf-parsewc.o/
thread-freeres.o/
argz-stringify.o/
string-inlines.o/
isoc99_vwscanf.o/
isoc99_fwscanf.o/
isoc99_vfwscanf.o/
isoc99_swscanf.o/
isoc99_vswscanf.o/
lc-time-cleanup.o/
getdirentries64.o/
sched_getaffinity.o/
sched_setaffinity.o/
spawn_faction_init.o/
spawn_faction_destroy.o/
spawn_faction_addclose.o/
spawn_faction_addopen.o/
spawn_faction_adddup2.o/
spawnattr_init.o/
spawnattr_destroy.o/
spawnattr_getdefault.o/
spawnattr_setdefault.o/
spawnattr_getflags.o/
spawnattr_setflags.o/
spawnattr_getpgroup.o/
spawnattr_setpgroup.o/
spawnattr_getsigmask.o/
spawnattr_getschedpolicy.o/
spawnattr_getschedparam.o/
spawnattr_setsigmask.o/
spawnattr_setschedpolicy.o/
spawnattr_setschedparam.o/
sched_cpucount.o/
sched_cpualloc.o/
posix_fadvise64.o/
posix_fallocate.o/
posix_fallocate64.o/
have_o_cloexec.o/
internal_statvfs.o/
internal_statvfs64.o/
sync_file_range.o/
remap_file_pages.o/
get_kernel_syms.o/
inotify_add_watch.o/
inotify_rm_watch.o/
timerfd_create.o/
timerfd_settime.o/
timerfd_gettime.o/
argp-fmtstream.o/
libc-lowlevellock.o/
libc-cancellation.o/
register-atfork.o/
unregister-atfork.o/
libc_pthread_init.o/
libc_multiple_threads.o/
service-lookup.o/
network-lookup.o/
backtracesymsfd.o/
readlinkat_chk.o/
getlogin_r_chk.o/
gethostname_chk.o/
getdomainname_chk.o/
mbsnrtowcs_chk.o/
wcsnrtombs_chk.o/
stack_chk_fail.o/
stack_chk_fail_local.o/
getrpcbynumber.o/
getrpcbyname_r.o/
getrpcbynumber_r.o/
getaliasname_r.o/
getipv4sourcefilter.o/
setipv4sourcefilter.o/
getsourcefilter.o/
setsourcefilter.o/
nscd_initgroups.o/
nscd_getserv_r.o/
dl-iteratephdr.o/
libc-anatomy $

- ふむ。極めてシンプル。


こつこつ。

0 件のコメント: