This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Finding the source code for ___tls_get_addr_internal()
- From: Saul Tamari <stamari at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Wed, 16 Jan 2013 15:08:21 -0500
- Subject: Finding the source code for ___tls_get_addr_internal()
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>