2012-05-09 14 views
10

私はGoogleのnaclコンパイラでいくつかのQtコードをコンパイルしましたが、ncvalバリデーターはそれをgrokしません。多くの中の一つの例:奇数コンパイル済みコード

#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 

にコンパイル:

src/corelib/animation/qabstractanimation.cpp:165 

ここに関連するコードです

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 

49Bでコール命令をチェックしてください:それはバリデータがないことができるものですグローク地球上でコンパイラが自分自身の真中に呼び出す命令を出すように誘導することができますか?これを回避する方法はありますか?私は-g -O0 -fno-inlineでコンパイルしました。コンパイラのバグ?

+0

とにかく、私はあきらめて、より良いツールチェーンを待っています。あなたはすばらしい答えを提供しました。ありがとう! – user1095108

答えて

3

おそらく、それはリンク時に記入される外部シンボルへの呼び出しです。実際に呼び出されるものはexternalSymbol-4です。これはちょっと変わったものです - おそらくこれがncvalバリデーターを香りから捨てているかもしれません。

+0

です。それの周りに道がある... Ahhhは私に言わないでください、すべて静的にリンクしますか? – user1095108

+1

「PIC」をオフにして、リンク時間を読み込み時間から移動するようにしてください。これは、最初に動的にリンクさせる原因の多くを無効にすることに注意してください。 –

+0

クラッシュしないようにリンクすることは可能ですか?試してみる価値はあるでしょうか? – user1095108

1

これは実行可能ファイルにまだリンクされていない動的ライブラリか静的オブジェクトですか?

動的ライブラリでは、コードが位置依存型としてビルドされ、動的ライブラリにリンクされているため、これはおそらく出てきました。 TEXTRELが表示された場合は、その上で "objdump -d -r -R"を実行してください。 TEXTRELはNaCl動的リンクのストーリーではサポートされていません。 (コードのコンパイル時に-fPICフラグを使用することで解決します)

静的オブジェクトは、静的実行可能ファイルにリンクされた後で検証を試みます。

関連する問題