LoginSignup
0
1

More than 5 years have passed since last update.

MIPSのコード

Posted at

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が狂うのかな。。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1