odd compiled code

assembly, c++, google-nativeclient, qt, x86

Solution

Presumably it's really a call to an external symbol, which will get filled in at link time. Actually what will get called is externalSymbol-4, which is a bit strange -- perhaps this is what is throwing the ncval validator off the scent.

Problem

I've compiled some Qt code with google's nacl compiler, but the ncval validator does not grok it. One example among many: ``` src/corelib/animation/qabstractanimation.cpp:165 ``` Here's the relevant code: ``` #define Q_GLOBAL_STATIC(TYPE, NAME) \ static TYPE *NAME() \ { \ static TYPE thisVariable; \ static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \ return thisGlobalStatic.pointer; \ } #ifndef QT_NO_THREAD Q_GLOBAL_STATIC(QThreadStorage<QUnifiedTimer *>, unifiedTimer) #endif ``` which compiles to: ``` 00000480 <_ZL12unifiedTimerv>: 480: 55 push %ebp 481: 89 e5 mov %esp,%ebp 483: 57 push %edi 484: 56 push %esi 485: 53 push %ebx 486: 83 ec 2c sub $0x2c,%esp 489: c7 04 24 28 00 2e 10 movl $0x102e0028,(%esp) 490: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi 494: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi 49b: e8 fc ff ff ff call 49c <_ZL12unifiedTimerv+0x1c> 4a0: 84 c0 test %al,%al 4a2: 74 1c je 4c0 <_ZL12unifiedTimerv+0x40> 4a4: 0f b6 05 2c 00 2e 10 movzbl 0x102e002c,%eax 4ab: 83 f0 01 xor $0x1,%eax 4ae: 84 c0 test %al,%al 4b0: 74 0e je 4c0 <_ZL12unifiedTimerv+0x40> 4b2: b8 01 00 00 00 mov $0x1,%eax 4b7: eb 27 jmp 4e0 <_ZL12unifiedTimerv+0x60> 4b9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi 4c0: b8 00 00 00 00 mov $0x0,%eax 4c5: eb 19 jmp 4e0 <_ZL12unifiedTimerv+0x60> 4c7: 90 nop 4c8: 90 nop 4c9: 90 nop 4ca: 90 nop 4cb: 90 nop ``` Check the call instruction at 49b: it is what the validator cannot grok. What on earth could induce the compiler to issue an instruction that calls into the middle of itself? Is there a way around this? I've compiled with -g -O0 -fno-inline. Compiler bug?

Original source