[LLVMdev] [lld] TBSS wrong size
Adhemerval Zanella
adhemerval.zanella at linaro.org
Tue Jun 2 15:20:24 PDT 2015
Hi,
I am tracking some TLS issues with lld and found that it is
generating wrong tbss size for case where multiple modules
have non initialized threads variables. For instance:
-- t0.c --
__thread int x0;
__thread int x1;
__thread int x2;
extern __thread int e0;
extern __thread int e1;
extern __thread int e2;
extern __thread int e3;
int foo0 ()
{
return x0;
}
int main ()
{
return x0;
}
-- t1.c --
__thread int e0;
__thread int e1;
__thread int e2;
__thread int e3;
---
lld is generating (for aarch64):
[14] .tbss NOBITS 0000000000401000 00001000
0000000000000010 0000000000000000 WAT 0 0 4
Where is just taking in consideration the largest tbss segment, not all
from all objects. ld generates a correct output:
[17] .tbss NOBITS 0000000000410dec 00000dec
000000000000001c 0000000000000000 WAT 0 0 4
My initial idea is that 'lib/ReaderWriter/ELF/SegmentChunks.cpp' /
Segment<ELFT>::assignVirtualAddress is setting wrong slice values, however
playing with this I could not find a correct logic to handle the TBSS.
Any ideas where lld is possible messing the TBSS segments sizes?
More information about the llvm-dev
mailing list