gcc4が吐き出したコード
00000090 <main>:
90: 3c1c0000 lui gp,0x0
94: 279c0000 addiu gp,gp,0
98: 0399e021 addu gp,gp,t9
9c: 27bdffe0 addiu sp,sp,-32
a0: afbf0018 sw ra,24(sp)
a4: afbc0010 sw gp,16(sp)
a8: 8f840000 lw a0,0(gp)
ac: 8f990000 lw t9,0(gp)
PIC(Position Independent Code)なコードなのでリンク時にgpなどの値が入る
ldでリンクしたコード
800010b0 <main>:
800010b0: 3c1c0001 lui gp,0x1
800010b4: 279ca060 addiu gp,gp,-24480
800010b8: 0399e021 addu gp,gp,t9
800010bc: 27bdffe0 addiu sp,sp,-32
800010c0: afbf0018 sw ra,24(sp)
800010c4: afbc0010 sw gp,16(sp)
800010c8: 8f848018 lw a0,-32744(gp)
800010cc: 8f99802c lw t9,-32724(gp)
gpが0x0001a060でそれからアクセスする800010c8で落ちる。
そもそもリンク時にワーニングが出る。
mips-ld: Main.o: warning: linking PIC files with non-PIC files
-mno-abicallsを付けてコンパイルするとこんなコード
80001098 <main>:
80001098: 3c048000 lui a0,0x8000
8000109c: 27bdffe8 addiu sp,sp,-24
800010a0: afbf0010 sw ra,16(sp)
これだとワーニングが出なくて動く。
なんでPICでリンク時にgpが狂うのかな。。。