Ошибка ld: раздел не найден для адреса - PullRequest
1 голос
/ 20 сентября 2011

Я на Mac OS X 10.6.5 с XCode 3.2.4 и пытаюсь скомпилировать / перенести базу кода, которая успешно компилируется на 10.5. Файл содержит код сборки, написанный вручную, для обработки исключений. Компиляция останавливается с ошибкой ld, говорящей, что раздел не найден для адреса 0x ... Что означает это сообщение об ошибке?

Я новичок в программировании на Mac OS X, но мой поиск в Интернете и документах мало что дал. С этим связан вопрос, что искать, пытаясь это исправить. Спасибо.

Я включу оригинальный код и объясню, что я пытался.

    .text

.align 1, 0x90
.globl _privateSnippetExecutorGeneral
_privateSnippetExecutorGeneral:
LFBg:
    movl    %esp,%ecx
    pushl   %ebp              # proper stack frame needed for exception handling
LCFIg0:
    movl    %esp,%ebp
LCFIg1:
    subl    $0x8,%esp         # padding + 32bit returnValue
    pushl   %esp              # 32bit &returnValue
    pushl   %ecx              # 32bit pCallStack
    pushl   %edx              # 32bit nVtableOffset
    pushl   %eax              # 32bit nFunctionIndex
    call    L_cpp_vtable_call$stub
    movl    16(%esp),%eax     # 32bit returnValue
    leave
    ret
LFEg:
    .long   .-_privateSnippetExecutorGeneral

Существует 6 из вышеперечисленных блоков кода сборки, практически идентичных. Я изменил некоторые 32-битные инструкции на 64-битные аналоги и скорректировал некоторые манипуляции со стеком. Вызов L_cpp_vtable_call $ stub типичен для динамического загрузчика для 32-битных операций i386. Я читал документы от x86_64 и Apple, но не видел четкого примера кода того, каким он должен быть.

...

    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
    .set L$set$frame1,LECIE1-LSCIE1
    .long   L$set$frame1      # length
LSCIE1:
    .long   0                 # CIE_ID
    .byte   1                 # version
    .ascii  "zPR\0"           # augmentation
    .byte   1                 # code_alignment_factor (.uleb128 1)
    .byte   0x7c              # data_alignment_factor (.sleb128 -4)
    .byte   8                 # return_address_register
    .byte   0x6               # augmentation size 7:
    .byte   0x9b              #  ???
    .long   L___gxx_personality_v0$non_lazy_ptr-.
    .byte   0x10
                              # initial_instructions:
    .byte   0x0C              #  DW_CFA_def_cfa %esp, 4
    .byte   5
    .byte   4
    .byte   0x88              #  DW_CFA_offset ret, 1
    .byte   1
    .align 2
LECIE1:

Вверху находится раздел CIE. Строка gxx_personality_v0 также следует типичному примеру кода динамического загрузчика для настройки процедуры обработки исключений по умолчанию. Я скомпилировал программу hello world, чтобы посмотреть, что выдает gcc, и изменил ее на

.long ___ gxx_personality_v0 + 4 @ GOTPCREL

...

    .globl _privateSnippetExecutorGeneral.eh
_privateSnippetExecutorGeneral.eh:
LSFDEg:
    .set L$set$g1,LEFDEg-LASFDEg
    .long   L$set$g1          # length
LASFDEg:
    .long   LASFDEg-EH_frame1 # CIE_pointer
    .long   LFBg-.            # initial_location
    .long   LFEg-LFBg         # address_range
    .byte   0                 # augmentation size 0
                              # instructions:
    .byte   0x04              #  DW_CFA_advance_loc4
    .long   LCFIg0-LFBg
    .byte   0x0E              #  DW_CFA_def_cfa_offset 8
    .byte   8
    .byte   0x84              #  DW_CFA_offset %ebp, 2
    .byte   2
    .byte   0x04              #  DW_CFA_advance_loc4
    .long   LCFIg1-LCFIg0
    .byte   0x0D              #  DW_CFA_def_cfa_register %ebp
    .byte   4
    .align 2
LEFDEg:

Тогда есть 6 секций FDE (как указано выше), соответствующих монтажным блокам. Я не модифицировал их.

...

    .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_cpp_vtable_call$stub:
    .indirect_symbol _cpp_vtable_call
    hlt ; hlt ; hlt ; hlt ; hlt                                                 
    .section __IMPORT,__pointers,non_lazy_symbol_pointers
L___gxx_personality_v0$non_lazy_ptr:
    .indirect_symbol ___gxx_personality_v0
    .long 0
    .constructor
    .destructor
    .align 1
    .subsections_via_symbols

Наконец разделы заглушки. Я не нашел слишком много документов, но, насколько я понимаю, эти разделы недействительны для x86_64. Соглашение о вызовах для динамической загрузки больше не требует заглушек, а использует глобальную таблицу смещений (GOT). Поэтому я закомментировал эти разделы. Есть вещи, которые я должен / не должен делать? Любые документы, на которые вы можете указать мне?

...