我在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)。所以我评论了这些部分。有什么我应该/不应该做的事情?你可以指点我的任何文件吗?