10

私はグーグルのnaclコンパイラでいくつかのQtコードをコンパイルしましたが、ncvalバリデーターはそれを取得しません。多くの中の1つの例:

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,%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を使用してコンパイルしました。コンパイラのバグ?

4

2 に答える 2

3

おそらく、それは実際には外部シンボルへの呼び出しであり、リンク時に入力されます。実際に呼び出されるのはexternalSymbol-4で、これは少し奇妙です。おそらく、これがncvalバリデーターを香りから外しているのです。

于 2012-05-09T19:56:48.563 に答える
1

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

ダイナミックライブラリでは、コードが位置依存として構築され、ダイナミックライブラリにリンクされているため、これが発生した可能性があります。「objdump-d-r-R」を試してみてください。TEXTRELが表示されている場合は、その場合です。TEXTRELは、NaClダイナミックリンクストーリーではサポートされていません。(コードのコンパイル中に-fPICフラグを設定することで解決)

静的オブジェクトを使用して、静的実行可能ファイルにリンクされた後で検証してみてください。

于 2012-05-18T09:21:01.220 に答える