ld错误:找不到地址的部分

时间:2011-09-20 03:39:23

标签: macos assembly ld

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

0 个答案:

没有答案