bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/16163] New: ld generates static relocations in shared library


From: scth2000 at yahoo dot de
Subject: [Bug ld/16163] New: ld generates static relocations in shared library
Date: Wed, 13 Nov 2013 10:24:47 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=16163

            Bug ID: 16163
           Summary: ld generates static relocations in shared library
           Product: binutils
           Version: unspecified
            Status: NEW
          Severity: minor
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: scth2000 at yahoo dot de

Hi,
I have a problem concerning the relocations generated by the linker:

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
    00000330  00001302 R_ARM_ABS32       00000000   lpv2
    000004b8  00000b02 R_ARM_ABS32       00000000   lpv1

Till now I believed, that the linker resolves all static relocations and
generates dynamic relocations (to be handled by the loader), where it is
necessary.
Why are there static relocations left in the linker output?
The document "ELF for the ARM Architecture" at
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf
says, R_ARM_ABS32 is a static relocation and also:

> 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, so a post-linker or dynamic loader will normally only haveto 
> deal with dynamic relocations.

BTW, this can also be reproduced using i386-elf-gcc, the static relocation used
there is R_386_32.

Can anyone tell me, why and tell me, which relocations should really be handled
in the loader?
In the meantime, I was told to use the option "-fPIC" - which in fact doesn't
help, also after that a static relocation (R_ARM_ABS32) is left in the library.

Example code:

    extern unsigned char lpv1;
    extern unsigned char lpv2;

    unsigned char* plpv1 = &lpv1;

    void func(void)
    {
        lpv2 = *plpv1;
    }

I got a first answer on that from the binutils mailing list from Nick Clifton:

> 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

Ok, on the one hand, libso.so is used at static link-time of an executable, as
described here.
But on the other hand, libso.so is installed (=loaded) as dynamic library on
the target - and that's the point I don't understand:
What shall the loader do with this static relocations?
Which static relocations can occur in a shared library and must be handled by
the loader ?

Regards,
Tom

-- 
You are receiving this mail because:
You are on the CC list for the bug.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]