我已经编译了一些使用谷歌的nacl编译器的Qt代码,但是ncval验证器没有编写它.很多的例子之一:
src/corelib/animation/qabstractanimation.cpp:165
以下是相关代码:
#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
其编译为:
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,%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,%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
检查在49b的呼叫指令:这是验证器不能grok.什么地方可能会导致编译器发出一个调用自身中间的指令?有没有解决的办法?我编译了-g -O0 -fno-inline.编译器错误?
解决方法
大概它真的是一个外部符号的呼叫,这将在链接时间填写.实际上将被称为externalSymbol-4,这有点奇怪 – 也许这是将ncval验证器放在气味上.