[Bug other/55354] [asan] by default, the asan run-time should be linked statically, not dynamically

konstantin.s.serebryany at gmail dot com gcc-bugzilla@gcc.gnu.org
Sun Nov 18 19:36:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55354

--- Comment #9 from Konstantin Serebryany <konstantin.s.serebryany at gmail dot com> 2012-11-18 19:35:43 UTC ---
As dvyuokv@ pointed out, 
-ftls-model=initial-exec improves the situation, but does not fully help. 

Experiment: 

% cat x.c 
__thread int a;
int foo() {
  return a;
}


HORRIBLE: -fPIC -shared
% gcc x.c -O2 -fPIC -shared -o x.so  ; objdump -d x.so  | grep foo.: -A 5 
00000000000006e0 <foo>:
 6e0:   66 48 8d 3d f0 08 20    lea    0x2008f0(%rip),%rdi        # 200fd8
<_DYNAMIC+0x1b8>
 6e7:   00 
 6e8:   66 66 48 e8 10 ff ff    callq  600 <__tls_get_addr@plt>
 6ef:   ff 
 6f0:   8b 00                   mov    (%rax),%eax


NOT-SO-BAD: -fPIC -shared  -ftls-model=initial-exec
% gcc x.c -O2 -fPIC -shared -o x.so  -ftls-model=initial-exec ; objdump -d x.so
 | grep foo.: -A 5 
0000000000000630 <foo>:
 630:   48 8b 05 a9 09 20 00    mov    0x2009a9(%rip),%rax        # 200fe0
<_DYNAMIC+0x1b8>
 637:   64 8b 00                mov    %fs:(%rax),%eax
 63a:   c3                      retq   


GOOD: -fPIE 
% gcc -c x.c -O2 -fPIE -o x.o  ; objdump -d x.o  | grep foo.: -A 5 
0000000000000000 <foo>:
   0:   64 8b 04 25 00 00 00    mov    %fs:0x0,%eax
   7:   00 
   8:   c3                      retq   


So, while -ftls-model=initial-exec improves the TLS performance, it is still 
2x slower than -fPIE. 

For tsan, which does this for *every* memory access in the original program, 
this will cost 5%-10% slowdown. 

For our users this is a big deal, so they will link the static library whenever
possible. Which default is used in gcc -- I don't care that much.



More information about the Gcc-bugs mailing list