[PATCH] D26133: [ELF] Allow relative relocations to absolute symbols in PIC

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 9 16:27:14 PST 2016


Petr Hosek <phosek at google.com> writes:

> On Thu, Dec 8, 2016 at 6:32 AM Rafael Avila de Espindola <
> rafael.espindola at gmail.com> wrote:
>
>> It is entirely possible we just have another case where lld gets
>> confused about a symbol being absolute or not. Can you provide the full
>> original code in musl that fails with lld?
>>
>
> I missed your response on the list. The original code that fails with lld
> is pretty much equivalent to the new test case I've added:
>
> # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> # RUN: echo "PROVIDE_HIDDEN(_BASE = 0);" > %t.script
> # RUN: ld.lld -shared --gc-sections --script %t.script -o %t1 %t
> # RUN: llvm-readobj --elf-output-style=GNU --file-headers --symbols %t1 |
> FileCheck %s
> # CHECK: 0000000000000000     0 NOTYPE  LOCAL  HIDDEN   ABS base
>
> .text
> .globl _start
> _start:
>         lea _BASE(%rip),%rax
>
> Currently, lld fails with the following error:
>
> bin/ld.lld: error: gc-start.o:(.text.internal+0x3): relocation
> R_X86_64_PC32 cannot refer to absolute symbol '_BASE' defined in (internal)

And the error is correct. Given the name of the variable, I assume that
what you are trying to do is:

. = 0;
PROVIDE_HIDDEN(_BASE = .);
....

That way _BASE is known to be a position in the file.

Cheers,
Rafael


More information about the llvm-commits mailing list