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



--- Comment #1 from Jack Howarth <howarth at nitro dot med.uc.edu> 2012-12-15 
14:02:23 UTC ---

This issue doesn't occur under darwin10 but when object files, created under

darwin10, are linked under darwin12 this runtime failure occurs. I opened

radar://12875171 in case this was a darwin linker bug. The darwin linker

developer looked at this crash and had the following comments...



This is a (gcc) compiler bug.  The crash is because register EBX is wrong in

function x() after returning from the call to function y().  Function y() has

some fancy jumps to labels.  After recursing 1000 times, it returns but does so

via messing with the stack frame:



LM6:

        movl    %ecx, %eax

        leal    L5-L00000000001$pb(%ebx), %edx

        movl    (%eax), %ebp

        movl    4(%eax), %esp

        jmp         *%edx



This code does not restore EBX.  On runtimes in which EBX is the same for all

functions (e.g pointer to GOT), not restoring EBX will work.  But on Mac OS X,

EBX is different in every function.  Once it is trashed upon returning to x(),

x stores some memory values via EBX.  It is doing the stores to the wrong

location, causing a later crash.



It worked with the SL linker by luck.  The smashers happened to be written to

non-critical areas (__gcov_var).

Reply via email to