2010-08-02 27 views
3

我有一個g ++建立一個應用程序鏈接到一個靜態庫,其中後者應包含一些全局函數寫在外部asm文件,用yasm編譯的問題。所以在圖書館,我有gcc,靜態庫,外部彙編函數變成未定義的符號

#ifdef __cplusplus 
extern "C" { 
#endif 

extern void __attribute__((cdecl)) interp1(char *pSrc); 
extern void __attribute__((cdecl)) interp2(char *pSrc); 

#ifdef __cplusplus 
} 
#endif 

我在庫內的其他地方引用。然後,有在ASM文件的執行情況,像這樣:編譯和鏈接做工精細的圖書館,我做

yasm -f elf32 -O2 -o interp.o interp.asm 

然後

ar -rc libInterp.a objs1.o [...] objsN.o interp.o 
ranlib libInterp.a 

現在

section .data 
; (some data) 
section .text 
; (some text) 

global _interp1 
_interp1: 
    ; (code ...) 
    ret 

global _interp2 
_interp2: 
    ; (code ...) 
    ret 

最後,將庫鏈接到主應用程序,我做

g++ -O4 -ffast-math -DNDEBUG -fomit-frame-pointer -DARCH_X86 -fPIC -o ../bin/interp this.o that.o -lboost_thread -lpthread ./libInterp.a 

和我得到的錯誤

undefined reference to `interp1' 
undefined reference to `interp2' 

什麼我錯在這裏做什麼?任何幫助表示讚賞。

+1

備註:-O4對gcc/g ++沒有任何作用。 -O3是最高級別,可能永遠是。 – 2010-08-02 23:59:38

+0

不是一個答案,只是一個提示:如果您正在生成ELF文件,那麼使用'readelf'來查看目標文件中的實際內容可能非常有用。 特別是,'readelf -s'會顯示目標文件定義和引用的符號;被引用的符號,並且需要來自別處的定義,被標記爲「UNDF」。您可能還需要傳遞'-W'標誌,否則列表將被截斷以適合80列,這可能會造成混淆。 – 2010-08-03 18:38:14

+0

非常有幫助,謝謝! – arionik 2010-08-03 23:21:55

回答

2

根據目標類型,gcc不會在外部符號前加下劃線。看來你的情況就是這種情況。

簡單的修復可能是從您的程序集文件中的名稱中刪除下劃線。

你可能consder幾個選擇可能是使用像在彙編文件的符號下面的宏之一:從http://www.dcs.warwick.ac.uk/~peter/otherstuff.html

  • http://svn.xiph.org/trunk/oggdsf/src/lib/codecs/webm/libvpx/src/vpx_ports/x86_abi_support.asm

    ; sym() 
    ; Return the proper symbol name for the target ABI. 
    ; 
    ; Certain ABIs, notably MS COFF and Darwin MACH-O, require that symbols 
    ; with C linkage be prefixed with an underscore. 
    ; 
    %ifidn __OUTPUT_FORMAT__,elf32 
    %define sym(x) x 
    %elifidn __OUTPUT_FORMAT__,elf64 
    %define sym(x) x 
    %elifidn __OUTPUT_FORMAT__,x64 
    %define sym(x) x 
    %else 
    %define sym(x) _ %+ x 
    %endif 
    
  • %macro public_c_symbol 1 
    GLOBAL %1,_%1 
    %1: 
    _%1: 
    %endmacro 
    
    public_c_symbol my_external_proc: 
        ; ... 
        RET 
    
相關問題