[llvm-dev] [LLD][ELF] Dynamic relocations list depends on the input files order
Simon Atanasyan via llvm-dev
llvm-dev at lists.llvm.org
Mon Apr 4 07:52:24 PDT 2016
Hi,
For MIPS it is possible that output executable file contains both GOT
entry and R_MIPS_COPY or R_MIPS_REL32 relocation for the same target
symbol. If LLD processes the relocation requires GOT entry before the
relocation requires COPY dynamic relocation, it generates the correct
output. If the order is reversed, LLD emits COPY dynamic relocation
only and does not generate a GOT entry (or shows an error in case of
x86 target).
It looks like the same problem affects other targets too, so I show a
reproduction script for x86 target.
% cat data.s
.data
.global foo
.type foo, at object
foo:
.word 0
% cat r-got.s
.text
.global _start
_start:
movl foo at GOT, %eax
% cat r-32.s
.text
ref:
movl $foo, (%esp)
% as --32 r-got.s -o r-got.o
% as --32 r-32.s -o r-32.o
% as --32 data.s -o data.o
% lld -flavor gnu data.o -shared -o libdata.so
% lld -flavor gnu r-32.o r-got.o libdata.so -o a.out
relocation R_386_GOT32 out of range
% lld -flavor gnu r-got.o r-32.o libdata.so -o a.out
% readelf -Sr a.out
...
[ 7] .got PROGBITS 00012058 002058 000004 00 WA 0 0 4
...
Relocation section '.rel.dyn' at offset 0x15c contains 2 entries:
Offset Info Type Sym.Value Sym. Name
00012058 00000106 R_386_GLOB_DAT 00013000 foo
00013000 00000105 R_386_COPY 00013000 foo
BTW the D18711 patch changes the LLD behavior. With this patch the
following command completes successfully, but does not produce .got
section.
% lld -flavor gnu r-32.o r-got.o libdata.so -o a.out
I planned to fix this problem but while D18711 is active I think it
does not have a sense to change the same code in parallel.
--
Simon Atanasyan
More information about the llvm-dev
mailing list