Hi,
Given such a source file,
/*fun.c*/
int b=2;
void fun(void)
{
  int a=b;
}

Then compile it,
$ mips-elf-gcc -shared -fpic fun.c -o fun.so -save-temps

We can see this below from fun.s,
lw      $2,%gp_rel(b)($28)

I think symble 'b' should be of GOT relocation.
But it isn't.

$ mips-elf-readelf -r fun.so

readelf: Error: Unable to read in 264144 bytes of dynamic segment

Relocation section '.rel.dyn' at offset 0x580 contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000000 R_MIPS_NONE
600207a0  00000003 R_MIPS_REL32

I have no idea about the error and the symble 'b' of pic codes.
Yet, when use this below
$ mips-elf-as fun.s -call_shared -o fun.so

$ mips-elf-readelf -r fun.so

Relocation section '.rel.text' at offset 0x3bc contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000000c  00000907 R_MIPS_GPREL16    00000000   b

Relocation section '.rel.pdr' at offset 0x3c4 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000a02 R_MIPS_32         00000000   fun

What's the reason? Seems mips gcc doesn't create GOT relacation.

Thanks.

Reply via email to