1

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? This document 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? Thanks in advance!

Example code:

extern unsigned char lpv1;
extern unsigned char lpv2;

unsigned char* plpv1 = &lpv1;

void func(void)
{
    lpv2 = *plpv1;
}
Thomas Schmid
  • 131
  • 10

2 Answers2

0

Can anyone tell me, why

Most likely because you are missing -fPIC flag at compile time.

Employed Russian
  • 164,132
  • 27
  • 242
  • 306
0

There is a follow-up on a mailing-list: https://sourceware.org/bugzilla/show_bug.cgi?id=16163

Benoit
  • 3,667
  • 23
  • 26