2016-02-01 72 views
0

我的函數沒有被NASM彙編器導出,因此我無法將其與我的C程序鏈接。我正在使用手冊中說的export指令,但它不被識別。哪裏不對?下面是我如何做到這一點:如何導出NASM中的符號

[[email protected] test]$ cat ssefuncs.S 
use64 
section .data 
NEW_LINE_4_SSE db '1111111111111111' 

section .text 

export find_nl_sse 

find_nl_sse: 
    mov rax,NEW_LINE_4_SSE 
    movntdqa xmm0,[esi] 
    pcmpestri xmm0,[rax],0x0 

    ret 

[[email protected] test]$ nasm -f elf64 -o ssefuncs.o ssefuncs.S 
ssefuncs.S:7: error: parser: instruction expected 
[[email protected] test]$ 

如果我省略了export,重新編譯安裝和嘗試鏈接,生成的代碼不會與我的C程序鏈接:

[[email protected] test]$ gcc -o bench3 ssefuncs.o bench3.o 
bench3.o: In function `main': 
/home/niko/quaztech/qstar/test/bench3.c:34: undefined reference to `find_nl_sse' 
collect2: error: ld returned 1 exit status 
[[email protected] test]$ 

我也嘗試過添加global指令但我得到相同的錯誤。 NASM文件爲何如此誤導?

+0

我開始提出兩個想法:1.在'section .text'之前嘗試移動'export find_nl_sse',同時嘗試'global'而不是'export'。 2.在asm中命名爲'_find_nl_sse'並在C'find_nl_sse'中。 –

+2

'global'和'export'做不同的縮寫。 – fuz

+0

@MarinovIván,它沒有幫助。將.text部分移出export/global後出現同樣的錯誤 – Nulik

回答

2

這裏是將標籤定義爲在當前裝配單元外可見的正確方法。

global _main 
_main: 
  1. global語句必須是實際的標籤之前
  2. 標籤必須以單下劃線

C文件將引用標記爲

extern _main 
+0

正確,只是我不能使用_main,我的C程序中有「main」符號。但它的工作。謝謝。 「標籤前」和刪除「導出」我認爲是成功編譯的關鍵 – Nulik

+0

至於下劃線,當使用ELF對象時,除非用'-fleading-underscore'明確地覆蓋前導下劃線,否則不需要前導下劃線。 –