2012-05-09 5 views
10

Я скомпилировал некоторый код Qt с компилятором nacl google, но средство проверки 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,%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: это то, что валидатор не может Grok. Что может побудить компилятор выдать инструкцию, которая звонит в середину? Есть ли способ обойти это? Я скомпилировал с -g -O0 -fno-inline. Ошибка компилятора?

+0

Во всяком случае, я сдаюсь и ожидаю лучшей инструментальной цепочки. Вы предоставили замечательные ответы. Благодаря! – user1095108

ответ

3

Предположительно, это действительно вызов внешнего символа, который будет заполняться во время связи. На самом деле то, что будет вызвано, это externalSymbol-4, что немного странно - возможно, это то, что отбрасывает валидатор ncval от запаха.

+0

Это так. Есть ли способ обойти это ... Ага, не говорите мне, свяжите все статически? – user1095108

+1

Попробуйте отключить 'PIC', который перемещает перемещение, чтобы связать время с временем загрузки. Обратите внимание, что это сводит на нет многие причины, из-за которых вы должны динамически связываться в первую очередь. –

+0

Возможно ли связать это, а не сбой? Попробует -fpic быть стоит? – user1095108

1

Является ли это динамической библиотекой или статическим объектом, который еще не связан с исполняемым файлом?

В динамической библиотеке это, скорее всего, появилось, потому что код был построен как зависящий от позиции и связанный в динамическую библиотеку. Попробуйте «objdump -d -r -R» на нем, если вы видите TEXTREL, это так. TEXTREL не поддерживается в динамических связях NaCl. (решается с помощью флага -fPIC во время компиляции кода)

С помощью статического объекта попытайтесь проверить после того, как он был связан с статическим исполняемым файлом.

Смежные вопросы