C の関数を呼ぶ Hello, world!

を書いてみました。要は再配置情報を一度手で書いてみたかった。これでコンパイラ書ける気がする。

http://shinh.skr.jp/binary/hello_libc.asm

Program header に INTERP と DYNAMIC を作ってやって、適当に埋めてやれば良いみたい。関数を探される心配はないのでハッシュとかちゃんと作らんくて良くてラクだった。 dlsym とかが動かんと思うけど。

途中までは ELF の仕様書とか読みつつやってたんだけど以下が素晴らしすぎると気付いてからサクサクできた。

http://wiki.osdev.info/index.php?ELF%2F%BC%C2%B9%D4%BB%FE%A4%CE%CF%C3

あとなんかサイズ 364Byte とかしか無いんだな。ゴルフ全くしてないのに。あと nm -D で No symbols なのは section header が無いからだと思う。

 i@colinux ~/wrk/shi> la hello call_puts -rwxr-xr-x 1 i 364 Sep 27 18:31 hello*
 i@colinux ~/wrk/shi> ldd hello
         linux-gate.so.1 =>  (0xffffe000)
         libc.so.6 => /lib/libc.so.6 (0xb7e8e000)
         /lib/ld-linux.so.2 (0xb7fe0000)
 i@colinux ~/wrk/shi> nm -D hello
 nm: hello: No symbols
 i@colinux ~/wrk/shi> ./hello
 Hello, world!

しかしこのへんの具体的な手続きを知るとなんか色々夢が広がる気がする。なんかしばらく遊んでみよう。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h