ultimate cause
ultimate cause

Reputation: 2294

R_386_32 Relocations in shared library

Trying to understand how the relocation happens in the situation below I have a shared library libbigshr.so which uses another shared library libfunlib.so. In the latter I have declared this global variable foo. To compile the former I had to do forward declaration as extern int foo.

.rel.dyn at libbigshr.so

Offset     Info    Type            Sym.Value  Sym. Name

000005a5  00000401 R_386_32          00000000   foo
000005ab  00000401 R_386_32          00000000   foo
000005c7  00000401 R_386_32          00000000   foo

.rel.dyn at libfunlib.so

000005a5  00000901 R_386_32          00002010   foo

In the libfunlib the translation offset is proper value (0x2010), therefore I don't have problem. But wanted to know the how the correct addresses were inserted in libbigshr. I can understand, that once a variable has been allocated the memory and its location is identified the same can be used everywhere else. But I am interested in the procedure of doing so.

Due to my ignorance my question may not have sufficient data to answer it - so please let me know and I will furnish more details.

Upvotes: 0

Views: 474

Answers (1)

Florian Weimer
Florian Weimer

Reputation: 33719

The correct address is generated by relocation processing at run time, by the dynamic linker. For example, in glibc, R_386_32 is processed in the i386 version of the elf_machine_rel function in the file sysdeps/i386/dl-machine.h. The glibc wiki has an overview of process startup. For details, see the references in the Linux Standard Base, particular those concerning the System V Application Binary Interface. For machine-specific information, H.J. Lu maintains a set of x86 ABI documents.

Upvotes: 1

Related Questions