This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: R_386_RELATIVE question
- From: Ian Lance Taylor <iant at google dot com>
- To: Gregory Shtrasberg <shtras at gmail dot com>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Thu, 27 Jan 2011 13:38:01 -0800
- Subject: Re: R_386_RELATIVE question
- References: <30775689.post@talk.nabble.com>
Gregory Shtrasberg <shtras@gmail.com> writes:
> Hello. I've got a question about the purpose of R_386_RELATIVE relocation
> Here's a part of disassemble of a library, built as follows:
> g++ -fPIC -c test.cpp -o test.o
> g++ -shared -Wl,-q -o libtest.so test.o
>
> At 0x1bcc there is a R_386_RELATIVE relocation, and the data in this address
> is 0x1c08, which is an address of __dso_handle. As far as I understand, it's
> not the job of R_386_RELATIVE to fix the value, so there should have been a
> linker relocation on 0x1bcc, pointing to 0x1c08. Am I right? (There is no
> other relocation on 0x1bcc besides R_386_RELATIVE)
> Thanks in advance
>
> Disassembly of section .got:
>
> 00001bcc <.got>:
> 1bcc: 08 1c 00 or %bl,(%eax,%eax,1)
> 1bcc: R_386_RELATIVE *ABS*
The value 0x1c08 is already there, in the section contents (see the
bytes "08 1c" and recall that the i386 is little-endian). The
R_386_RELATIVE directs the dynamic linker to adjust the value by the
load address of the shared library, so that at runtime it will be the
address where __dso_handle winds up.
Ian