[llvm-bugs] [Bug 29068] New: Static TLS for i386: addend ignored
via llvm-bugs
llvm-bugs at lists.llvm.org
Sat Aug 20 01:18:45 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=29068
Bug ID: 29068
Summary: Static TLS for i386: addend ignored
Product: lld
Version: unspecified
Hardware: PC
OS: other
Status: NEW
Severity: release blocker
Priority: P
Component: ELF
Assignee: unassignedbugs at nondot.org
Reporter: ed at 80386.nl
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
Consider the following piece of code:
#include <stdio.h>
_Thread_local struct {
int x, y, z;
} var = { .x = 12, .y = 34, .z = 56 };
void print(int);
int main() {
print(var.y);
}
Compiling it for i686 will yield the following main() function (abbreviated):
main:
movl %gs:0, %eax
pushl var at NTPOFF+4(%eax)
calll print
addl $4, %esp
xorl %eax, %eax
retl
Now, changing the call to print() to var.z, we get:
main:
movl %gs:0, %eax
pushl var at NTPOFF+8(%eax)
calll print
addl $4, %esp
xorl %eax, %eax
retl
This is all good. Now this is where the interesting part starts. If we link it
into a simple executable, we always generate the following code (as in, it
doesn't matter if var.y or var.z is used):
00014750 <main>:
14750: 65 a1 00 00 00 00 mov %gs:0x0,%eax
14756: ff b0 dc ff ff ff pushl -0x24(%eax)
1475c: e8 0f 00 00 00 call 14770 <print>
14761: 83 c4 04 add $0x4,%esp
14764: 31 c0 xor %eax,%eax
14766: c3 ret
The value that is passed to print() is equal to twelve. In other words, the
linker completely ignores the addend of the relocation, always making it use
the first element in the structure.
I'll debug this issue in more detail. Marking this as a blocker for LLVM 3.9,
as it makes PIE effectively broken when used in non-PIE code on i386. The issue
is both present in trunk and 3.9rc1.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160820/f439e14c/attachment.html>
More information about the llvm-bugs
mailing list