Hi, I'm debugging some C++ application which crashed with a segmentation fault caused by trying to access address 0xc. After some digging I learned that the crash happened in __cxa_allocate_exception() in the following code: __cxa_eh_globals *globals = __cxa_get_globals (); globals->uncaughtExceptions += 1; <-- this tries to increment the word at address 0xc - addl $0x1,0x4(%eax) Checking __cxa_get_globals() shows that it calls ___tls_get_addr@plt which in turn jumps to ___tls_get_addr_internal which returns 0x8 in eax. I suspect the cause of this wrong return value is with some issue related to the gs descriptor but I have no proof about that. Is ___tls_get_addr_internal() compiled from C source code or is it generated directly in assembly code? Where can I find the C source code that was used to generate ___tls_get_addr_internal ? The compiler used was g++4.4.6 Thanks, Saul (gdb) disas 0xf7f1dd50 Dump of assembler code for function ___tls_get_addr_internal: 0xf7f1dd50 <___tls_get_addr_internal+0>: push %ebp 0xf7f1dd51 <___tls_get_addr_internal+1>: mov %esp,%ebp 0xf7f1dd53 <___tls_get_addr_internal+3>: sub $0x28,%esp 0xf7f1dd56 <___tls_get_addr_internal+6>: mov %ebx,-0xc(%ebp) 0xf7f1dd59 <___tls_get_addr_internal+9>: mov %esi,-0x8(%ebp) 0xf7f1dd5c <___tls_get_addr_internal+12>: mov %eax,%esi 0xf7f1dd5e <___tls_get_addr_internal+14>: mov %edi,-0x4(%ebp) 0xf7f1dd61 <___tls_get_addr_internal+17>: call 0xf7f22feb <__i686.get_pc_thunk.bx> 0xf7f1dd66 <___tls_get_addr_internal+22>: add $0xb25a,%ebx 0xf7f1dd6c <___tls_get_addr_internal+28>: mov %gs:0x4,%eax 0xf7f1dd72 <___tls_get_addr_internal+34>: mov (%eax),%edx 0xf7f1dd74 <___tls_get_addr_internal+36>: cmp 0x5dc(%ebx),%edx 0xf7f1dd7a <___tls_get_addr_internal+42>: mov %eax,-0x18(%ebp) 0xf7f1dd7d <___tls_get_addr_internal+45>: movl $0x0,-0x14(%ebp) 0xf7f1dd84 <___tls_get_addr_internal+52>: jne 0xf7f1dda7 <___tls_get_addr_internal+87> 0xf7f1dd86 <___tls_get_addr_internal+54>: mov (%esi),%edx 0xf7f1dd88 <___tls_get_addr_internal+56>: lea (%eax,%edx,8),%eax 0xf7f1dd8b <___tls_get_addr_internal+59>: mov %eax,-0x1c(%ebp) 0xf7f1dd8e <___tls_get_addr_internal+62>: mov (%eax),%edi 0xf7f1dd90 <___tls_get_addr_internal+64>: cmp $0xffffffff,%edi 0xf7f1dd93 <___tls_get_addr_internal+67>: je 0xf7f1ddbf <___tls_get_addr_internal+111> 0xf7f1dd95 <___tls_get_addr_internal+69>: add 0x4(%esi),%edi 0xf7f1dd98 <___tls_get_addr_internal+72>: mov -0xc(%ebp),%ebx 0xf7f1dd9b <___tls_get_addr_internal+75>: mov -0x8(%ebp),%esi 0xf7f1dd9e <___tls_get_addr_internal+78>: mov %edi,%eax 0xf7f1dda0 <___tls_get_addr_internal+80>: mov -0x4(%ebp),%edi 0xf7f1dda3 <___tls_get_addr_internal+83>: mov %ebp,%esp 0xf7f1dda5 <___tls_get_addr_internal+85>: pop %ebp 0xf7f1dda6 <___tls_get_addr_internal+86>: ret 0xf7f1dda7 <___tls_get_addr_internal+87>: mov (%esi),%eax 0xf7f1dda9 <___tls_get_addr_internal+89>: mov %eax,(%esp) 0xf7f1ddac <___tls_get_addr_internal+92>: call 0xf7f1daf0 <_dl_update_slotinfo> 0xf7f1ddb1 <___tls_get_addr_internal+97>: mov %eax,-0x14(%ebp) 0xf7f1ddb4 <___tls_get_addr_internal+100>: mov %gs:0x4,%eax 0xf7f1ddba <___tls_get_addr_internal+106>: mov %eax,-0x18(%ebp) 0xf7f1ddbd <___tls_get_addr_internal+109>: jmp 0xf7f1dd86 <___tls_get_addr_internal+54> 0xf7f1ddbf <___tls_get_addr_internal+111>: mov -0x14(%ebp),%edi 0xf7f1ddc2 <___tls_get_addr_internal+114>: test %edi,%edi 0xf7f1ddc4 <___tls_get_addr_internal+116>: je 0xf7f1de3f <___tls_get_addr_internal+239> 0xf7f1ddc6 <___tls_get_addr_internal+118>: mov -0x14(%ebp),%edx 0xf7f1ddc9 <___tls_get_addr_internal+121>: mov 0x230(%edx),%eax 0xf7f1ddcf <___tls_get_addr_internal+127>: mov %eax,0x4(%esp) 0xf7f1ddd3 <___tls_get_addr_internal+131>: mov 0x234(%edx),%eax 0xf7f1ddd9 <___tls_get_addr_internal+137>: mov %eax,(%esp) 0xf7f1dddc <___tls_get_addr_internal+140>: call 0xf7f0d798 <__libc_memalign@plt> 0xf7f1dde1 <___tls_get_addr_internal+145>: test %eax,%eax 0xf7f1dde3 <___tls_get_addr_internal+147>: mov %eax,%edi 0xf7f1dde5 <___tls_get_addr_internal+149>: je 0xf7f1de64 <___tls_get_addr_internal+276> 0xf7f1dde7 <___tls_get_addr_internal+151>: mov -0x14(%ebp),%edx 0xf7f1ddea <___tls_get_addr_internal+154>: mov 0x22c(%edx),%eax 0xf7f1ddf0 <___tls_get_addr_internal+160>: mov 0x230(%edx),%edx 0xf7f1ddf6 <___tls_get_addr_internal+166>: mov %eax,0x8(%esp) 0xf7f1ddfa <___tls_get_addr_internal+170>: sub %eax,%edx 0xf7f1ddfc <___tls_get_addr_internal+172>: mov %edx,-0x10(%ebp) 0xf7f1ddff <___tls_get_addr_internal+175>: mov -0x14(%ebp),%edx 0xf7f1de02 <___tls_get_addr_internal+178>: mov 0x228(%edx),%eax 0xf7f1de08 <___tls_get_addr_internal+184>: mov %edi,(%esp) 0xf7f1de0b <___tls_get_addr_internal+187>: mov %eax,0x4(%esp) 0xf7f1de0f <___tls_get_addr_internal+191>: call 0xf7f22e30 <mempcpy> 0xf7f1de14 <___tls_get_addr_internal+196>: mov -0x10(%ebp),%edx 0xf7f1de17 <___tls_get_addr_internal+199>: movl $0x0,0x4(%esp) 0xf7f1de1f <___tls_get_addr_internal+207>: mov %edx,0x8(%esp) 0xf7f1de23 <___tls_get_addr_internal+211>: mov %eax,(%esp) 0xf7f1de26 <___tls_get_addr_internal+214>: call 0xf7f22de0 <memset> 0xf7f1de2b <___tls_get_addr_internal+219>: mov -0x1c(%ebp),%eax 0xf7f1de2e <___tls_get_addr_internal+222>: mov %edi,(%eax) 0xf7f1de30 <___tls_get_addr_internal+224>: mov (%esi),%eax 0xf7f1de32 <___tls_get_addr_internal+226>: mov -0x18(%ebp),%edx 0xf7f1de35 <___tls_get_addr_internal+229>: movb $0x0,0x4(%edx,%eax,8) 0xf7f1de3a <___tls_get_addr_internal+234>: jmp 0xf7f1dd95 <___tls_get_addr_internal+69> 0xf7f1de3f <___tls_get_addr_internal+239>: mov 0x5c4(%ebx),%edi 0xf7f1de45 <___tls_get_addr_internal+245>: mov %edx,%eax 0xf7f1de47 <___tls_get_addr_internal+247>: mov (%edi),%ecx 0xf7f1de49 <___tls_get_addr_internal+249>: cmp %ecx,%edx 0xf7f1de4b <___tls_get_addr_internal+251>: jb 0xf7f1de58 <___tls_get_addr_internal+264> 0xf7f1de4d <___tls_get_addr_internal+253>: mov 0x4(%edi),%edi 0xf7f1de50 <___tls_get_addr_internal+256>: sub %ecx,%eax 0xf7f1de52 <___tls_get_addr_internal+258>: mov (%edi),%ecx 0xf7f1de54 <___tls_get_addr_internal+260>: cmp %eax,%ecx 0xf7f1de56 <___tls_get_addr_internal+262>: jbe 0xf7f1de4d <___tls_get_addr_internal+253> 0xf7f1de58 <___tls_get_addr_internal+264>: mov 0xc(%edi,%eax,8),%eax 0xf7f1de5c <___tls_get_addr_internal+268>: mov %eax,-0x14(%ebp) 0xf7f1de5f <___tls_get_addr_internal+271>: jmp 0xf7f1ddc6 <___tls_get_addr_internal+118> 0xf7f1de64 <___tls_get_addr_internal+276>: lea -0x3584(%ebx),%eax 0xf7f1de6a <___tls_get_addr_internal+282>: mov %eax,0x4(%esp) 0xf7f1de6e <___tls_get_addr_internal+286>: movl $0x2,(%esp) 0xf7f1de75 <___tls_get_addr_internal+293>: call 0xf7f1bfd0 <_dl_dprintf> 0xf7f1de7a <___tls_get_addr_internal+298>: movl $0x7f,(%esp) 0xf7f1de81 <___tls_get_addr_internal+305>: call 0xf7f226f4 <_exit>