This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]