正直日記



2008/03/01

_ 4.3-20080228版 devkitARM を作りなおしてみる
早速、手元のプロジェクトでも再ビルドしてみるかと思ったら、リンクする段に
なって libsysbase が無いとか _sbrk がみつからないとかもーなんなのです!

_sbrk ってことは、どうやら newlib を configure する時点でしくじっていた
らしいな……と、libc の objdump を見ながら思うのだった。確かに、無い。

今更気づいたけど、buildscripts-20060724を再利用するよりも、CVSから持ってき
たスクリプトを再利用した方がよかったらしい。内容を眺めてみたら、libsysbase
を作るよう newlib の libgloss/configure にパッチを当てているみたいだ。

--

というわけで再ビルドしたら、今度はちゃんと libsysbase も作られているし、
その中に_sbrk が含まれているようだ。よかったよかっ……

h:/gcc/devkitARM/bin/../lib/gcc/arm-eabi/4.3.0/../../../../arm-eabi/bin/ld.exe: section .data [08103ce4 -> 0810457f] overlaps .bss [08103ce4 -> 08104c6b] collect2: ld returned 1 exit status
あれっ。困るなー。mapが出力されているので見る。
.bss 0x03004794 0xf88 load address 0x08103ce4 .data 0x0300571c 0x89c load address 0x08103ce4
なぜ .bss に load address がついてるんだー?そして何故、同アドレスですか? どうも ld 2.18.50 がおかしい気がする。本家 devkitARM の ld 2.17 とバイナ リを差し替えてみた。エラー無しでリンク完了。map 出力。
.bss 0x03004794 0xf88 .data 0x0300571c 0x89c load address 0x08103ce4
これが正しい姿なのだよ。しかし困ったな。
_ 4.3-20080228版 devkitARM を作ってみた
というわけで……

http://d.hatena.ne.jp/toge/20080229#1204238423

こちらをarm-eabiで確認したかったんだ。
比較対象が古いけど気にしない!

arm-elf-gcc -O3 -marm -S : gcc version 3.4.3
_Z3fooi: mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} subs r4, r0, #0 sub fp, ip, #4 sub r0, r4, #1 mov r3, #1 ble .L1 bl _Z3fooi mul r3, r4, r0 .L1: mov r0, r3 ldmfd sp, {r4, fp, sp, pc} main: mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} mov r4, #10 sub fp, ip, #4 sub r0, r4, #1 bl _Z3fooi mul r1, r0, r4 ldr r0, .L8 bl printf mov r0, #0 ldmfd sp, {r4, fp, sp, pc}
arm-eabi-gcc -O3 -marm -S : gcc version 4.3.0 20080228 (prerelease) (GCC)
main: .fnstart .LFB915: str lr, [sp, #-4]! .save {lr} .LCFI1: mov r1, #3620864 .pad #4 sub sp, sp, #4 .LCFI2: add r1, r1, #7936 ldr r0, .L7 bl printf mov r0, #0 add sp, sp, #4 ldr lr, [sp], #4 bx lr
いやー良かった良かった。ちゃんと畳み込まれてる。 定数が二つに分解されてるのがARMらしいね。  3620864 + 7936 = 3628800 ARMv4のイミディエイトは符号無し8ビット即値を4bit量ローテートなので、こう。  #3620864 = (221 << 14)  #7936 = (124 << 6) つか定数の分解って今まではあまりされてなかった気がする。何気に嬉しいかも。

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12