Я на 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). Поэтому я закомментировал эти разделы. Есть вещи, которые я должен / не должен делать? Любые документы, на которые вы можете указать мне?