tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: gprof segfaults in mcount



On Sun, Apr 24, 2016 at 03:50:41PM +0200, Timo Buhrmester wrote:
 > Dump of assembler code for function mcount:
 >    0x0805045f <+0>:	push   %ebp
 >    0x08050460 <+1>:	push   %edi
 >    0x08050461 <+2>:	push   %esi
 >    0x08050462 <+3>:	push   %ebx
 >    0x08050463 <+4>:	sub    $0x18,%esp
 >    0x08050466 <+7>:	mov    %eax,%ebp
 >    0x08050468 <+9>:	mov    %ecx,0x8(%esp)
 >    0x0805046c <+13>:	mov    %edx,%esi
 > => 0x0805046e <+15>:	mov    0x4(%ebp),%ebx
 >    0x08050471 <+18>:	mov    0x0(%ebp),%edi
 >    0x08050474 <+21>:	mov    0x4(%edi),%edi
 >    0x08050477 <+24>:	mov    0x80759e0,%ecx
 >    0x0805047d <+30>:	test   %ecx,%ecx
 >    0x0805047f <+32>:	je     0x805049f <mcount+64>
 >    0x08050481 <+34>:	mov    0x8074880,%edx
 >    0x08050487 <+40>:	test   %edx,%edx
 >    0x08050489 <+42>:	je     0x805052f <mcount+208>

It appears that the mcount() entry point defined in
sys/arch/i386/include/profile.h is flatly broken with the new gcc --
the marked instruction is from an __asm that assumes a frame pointer
and there is no frame pointer.

Judging by what that code appears to be doing (e.g. saving caller-save
registers), writing it in C with __asm seems a mistake and bound to
explode with every new compiler version...

-- 
David A. Holland
dholland%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index