2012-05-09 39 views
10

Tôi đã biên soạn một số mã Qt với trình biên dịch nacl của google, nhưng trình xác thực ncval không bẻ khóa nó. Một ví dụ trong số rất nhiều:mã được biên dịch lẻ

src/corelib/animation/qabstractanimation.cpp:165 

Dưới đây là các mã có liên quan:

#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 

mà biên dịch để:

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 

Kiểm tra lệnh gọi tại 49b: nó là gì validator có thể không grok. Cái gì trên trái đất có thể làm cho trình biên dịch đưa ra một lệnh mà các cuộc gọi vào giữa chính nó? Có cách nào để giái quyết vấn đề này không? Tôi đã biên soạn với -g -O0 -fno-inline. Lỗi trình biên dịch?

+0

Dù sao, tôi đang từ bỏ và chờ đợi một chuỗi công cụ tốt hơn. Bạn đã cung cấp câu trả lời tuyệt vời. Cảm ơn! – user1095108

Trả lời

3

Có lẽ đó thực sự là cuộc gọi đến biểu tượng bên ngoài, biểu tượng này sẽ được điền vào lúc liên kết. Trên thực tế những gì sẽ được gọi là externalSymbol-4, đó là một chút lạ - có lẽ đây là những gì đang ném trình xác nhận ncval ra khỏi mùi hương.

+0

Đó là. Có cách nào xung quanh nó không ... Ahhh đừng nói với tôi, liên kết mọi thứ một cách tĩnh lặng? – user1095108

+1

Thử tắt 'PIC' để di chuyển các vị trí liên kết đến thời gian tải. Lưu ý rằng điều này vô hiệu hóa nhiều lý do khiến bạn tự động liên kết ở vị trí đầu tiên. –

+0

Có thể liên kết như thế và không bị hỏng không? Sẽ cố gắng -fpic được giá trị? – user1095108

1

Đây có phải là thư viện động hoặc đối tượng tĩnh không được liên kết với tệp thi hành chưa?

Trong thư viện động, điều này có thể xuất hiện vì mã được xây dựng dưới dạng phụ thuộc vào vị trí và được liên kết vào thư viện động. Hãy thử "objdump -d -r -R" trên đó, nếu bạn thấy TEXTREL, đó là trường hợp. TEXTREL không được hỗ trợ trong các câu chuyện liên kết động NaCl. (được giải quyết bằng cờ -fPIC trong khi biên soạn mã)

Với một đối tượng tĩnh cố gắng xác thực sau khi nó được liên kết thành một tệp thực thi tĩnh.

Các vấn đề liên quan