« デマングル(demangle) | Main | ドアドア »

2006.02.04

SysytemCの最初の一歩

libsystemc.a内に目的の関数があることが分かったので、あとはリンカーの問題。
リンカーのコマンドがデフォでこう。

/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/home/natu/system_data/systemc-2.1.v1/lib-linux/ -L/usr/lib -lsystemc arith01.o -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o

-V -dynamic-linkerがちょっと気になるが、まあまあ予想通り。
一般的に組み込みCのリンカってのはこんな動きをする。

・.oを aliginとかの情報に従って並べる。
・このとき、アドレスが解決できないラベルがあれば、指定されたライブラリから
飛び先を探しに行く。たいがい、最初に見つけたライブラリを結合するので、
同じ関数が、別のライブラリにあるときなどは、ライブラリのサーチパスの
順番で挙動がかわったりする。
・どうしても解決できない場合は、エラーで終了
・組込用の特徴として、「誰からも参照されていない関数、変数を削除」というのは
デフォでは行われない。(アセンブラで飛んだり、DMA領域だったりするから)

で、今 crtnから呼び出されているmain()は見つかったのだから、libsystemc.aは
ちゃんと読み込まれている。で、libsysytemc.aからarith01.o内のsc_main()を
呼び出し、そのsc_main()が、またlibsystemc.a内のsc_dt::sc_signed::sc_signed(int)
を読み出す。
OK、分かった。sc_main()のあるユーザープログラムと、libsystemc.aが相互参照
になっているんだ。

そんな仮説を立てながら、リンカコマンドを試行錯誤し、うほっ動いた。
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/home/natu/system_data/systemc-2.1.v1/lib-linux/ -L/usr/lib -lsystemc /home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a arith01.o -lsystemc /home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/cr
tend.o /usr/lib/crtn.o

仮説はあっているようだ。もうちょっと、直してみて、完成
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib -L/home/natu/system_data/systemc-2.1.v1/lib-linux/ arith01.o /home/natu/system_data/systemc-2.1.v1/lib-linux/libsystemc.a -lsystemc -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o

夢にまで見た a.out
./a.outで、
-256 -256から始まって、最後-256、-256まで変化する事を確認。

大きな一歩だけど、まだまだ入り口

|

« デマングル(demangle) | Main | ドアドア »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/8497622

Listed below are links to weblogs that reference SysytemCの最初の一歩:

« デマングル(demangle) | Main | ドアドア »