ld generates static relocations in shared library

nick clifton nickc@redhat.com
Fri Aug 23 10:52:00 GMT 2013


Hi Thomas,
> If I compile the example code at the bottom with
>
>      arm-elf-gcc init.c -o lib.so -Wl,-shared -nostdlib
>
> I get a shared library with some relocations (readelf lib.so -r):
>
>      0000032c  00000d02 R_ARM_ABS32       000004b8   plpv1

Yes - this is correct...

>> >Static relocations are processed by a static linker; they are normally either fully resolved or used to produce dynamic relocations
>> >for processing by a post-linking step or a dynamic loader. A well formed image will have no static relocations after static linking
>> >is complete,

Right - but libso.so is not a fully linked binary.  It is a shared 
library that is going to be used as part of another static link operation.

For example:

   % cat main.c
   extern void func (void);
   extern int printf (const char *, ...);

   unsigned char lpv1, lpv2;

   int main (void)
   {
     lpv1 = 1;
     lpv2 = 2;
     func ();
     return printf ("lpv1 = %d lpv2 = %d\n", lpv1, lpv2);
   }

   % arm-elf-gcc main.c -L. lib.so

   % readelf -r a,out
   Relocation section '.rel.plt' at offset 0x8220 contains 5 entries:
    Offset     Info    Type            Sym.Value  Sym. Name
   0001a984  00000216 R_ARM_JUMP_SLOT   00000000   malloc
   0001a988  00000416 R_ARM_JUMP_SLOT   00000000   __deregister_frame_inf
   0001a98c  00000916 R_ARM_JUMP_SLOT   0000828c   func
   0001a990  00000e16 R_ARM_JUMP_SLOT   00000000   __register_frame_info
   0001a994  00001016 R_ARM_JUMP_SLOT   00000000   free


So now all of the static relocations have been resolved and only dynamic 
relocations remain.

Cheers
   Nick



More information about the Binutils mailing list