Hello,
My today's problem was to evaluate crashes in compiler-rt's xray tests.
After some debugging, I've came to the conclusion that the primary cause
is that TLS allocated for aligned objects isn't actually aligned.
Take the following sample (C++11) program:
#include <cstdio>
struct alignas(64) a {
int x;
};
void b() {
thread_local a as_tls;
printf("as tls: %p\n", &as_tls);
}
int main() {
b();
return 0;
}
Both when compiled with g++ and with clang++, I get:
as tls: 0x7f7ff7efe068
which is certainly not aligned on 64-byte boundary. I have tested
the same program on Linux and FreeBSD, and on both platforms I get
properly aligned addresses. Furthermore, if I change the alignment
value, I see the address changing on Linux and FreeBSD but not
on NetBSD.
This is problematic to me since clang/llvm seem to assume that
the object will actually be aligned, and emit code (e.g. MOVAPS
instructions) that segfaults when dealing with unaligned data.
Is this a fault of our ld.so implementation? Could someone help me
figure out how to solve this?
--
Best regards,
Michał Górny
Attachment:
signature.asc
Description: This is a digitally signed message part