Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

odd compiled code

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?

like image 968
user1095108 Avatar asked May 09 '12 19:05

user1095108


2 Answers

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.

like image 173
TonyK Avatar answered Oct 02 '22 03:10

TonyK


Is this a dynamic library or a static object that is not linked to an executable yet?

In a dynamic library this likely came out because the code was built as position-dependent and linked into a dynamic library. Try "objdump -d -r -R" on it, if you see TEXTREL, that is the case. TEXTREL is not supported in NaCl dynamic linking stories. (solved by having -fPIC flag during compilation of the code)

With a static object try to validate after it was linked into a static executable.

like image 45
Egor Pasko Avatar answered Oct 02 '22 03:10

Egor Pasko