2012-10-17 70 views
0

彙編函數我不能找到解決這個問題..未定義的引用調用用C

我試圖做的是使用gcc調用匯編函數。只要看一看:

// Somewhere in start.s 
global _start_thread 
_start_thread: 
    ; ... 


// Somewhere in UserThread.cpp 
extern void _start_thread(pointer); 

static void UserMainHack() 
{ 
    _start_thread(((UserThread*)currentThread)->getUserMain()); 
} 

感謝您的幫助..

+0

是什麼問題?你能發佈錯誤嗎? – elyashiv

+0

你可以發佈你使用的編譯命令嗎? – elyashiv

+0

您是否在編譯過程中以與.c,.cpp文件相同的方式提供程序集文件? – UmNyobe

回答

4

你知道,許多C接頭自動尋找標識符時,添加前面的下劃線?所以在C源(彙編源),只是刪除前面的下劃線:

extern void start_thread(pointer); 

static void UserMainHack() 
{ 
    start_thread(((UserThread*)currentThread)->getUserMain()); 
} 
+0

爲什麼鏈接器要這樣做? – elyashiv

+0

@elyashiv:名稱,重整制度是由實現(雖然DLL格式都有發言權),這是錯位的名稱,而不是你在組裝來實現未重整的名稱。所以鏈接器添加'_'的原因就是它破壞了名稱。這(例如)的Win32貼在錯位的名稱,甚至在C面前疣的原因是爲了表明其調用約定的功能使用,讓你永遠不小心不要使用錯誤的常規功能鏈接。 Win64沒有這樣做,因爲只有一個調用約定。 –

+0

我想這太,但它沒有工作,要麼..見上 – displayname

2

通過使用 「Asm Label」 給你的函數[聲明]裝配聯動:

extern void start_thread(pointer) __asm__("start_thread"); 

(並且在asm端有.global匹配它。)

它的工作原理與extern "C"非常相似,它可以用於函數和變量,並且它是單向的(但是這次在C方)。

+1

找到我自己的問題,這一次,是解決:) – displayname