第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Win32上使用GCC在裝配符號(hào)中添加前導(dǎo)下劃線?

在Win32上使用GCC在裝配符號(hào)中添加前導(dǎo)下劃線?

撒科打諢 2019-12-15 11:12:52
我有一段C代碼,它調(diào)用程序集中定義的函數(shù)。舉例來(lái)說(shuō),假設(shè)foo.c包含:int bar(int x);  /* returns 2x */int main(int argc, char *argv[]) { return bar(7); }bar.s包含x86匯編中bar()的實(shí)現(xiàn):.global barbar:    movl 4(%esp), %eax        addl %eax, %eax        ret在Linux上,我可以輕松地通過(guò)GCC編譯和鏈接這些源,如下所示:% gcc -o test foo.c bar.s% ./test; echo $?14在具有MinGW的Windows上,此操作將失敗,并顯示“未定義對(duì)'bar'的引用”錯(cuò)誤。事實(shí)證明,這是因?yàn)樵赪indows上,所有具有C調(diào)用約定的函數(shù)標(biāo)識(shí)符都以下劃線作為前綴,但是由于“ bar”是在程序集中定義的,因此不會(huì)獲得該前綴,并且鏈接失敗。(因此錯(cuò)誤消息實(shí)際上是在抱怨缺少符號(hào)_bar而不是bar。)總結(jié)一下:% gcc -c foo.c bar.s% nm foo.o bar.ofoo.o:00000000 b .bss00000000 d .data00000000 t .text         U ___main         U _bar00000000 T _mainbar.o:00000000 b .bss00000000 d .data00000000 t .text00000000 T bar現(xiàn)在的問(wèn)題是:如何解決這個(gè)問(wèn)題?如果僅針對(duì)Windows編寫(xiě),則可以在bar.s的標(biāo)識(shí)符中添加下劃線,但是在Linux上代碼會(huì)中斷。我已經(jīng)看過(guò)gcc的-fleading-underscore和-fno-leading-underscore選項(xiàng),但似乎都沒(méi)有做任何事情(至少在Windows上如此)。我現(xiàn)在看到的唯一替代方法是通過(guò)C預(yù)處理器傳遞程序集文件,并在定義WIN32的情況下手動(dòng)重新定義所有聲明的符號(hào),但這也不是很漂亮。有人對(duì)此有干凈的解決方案嗎?也許是我監(jiān)督的編譯器選項(xiàng)?也許GNU匯編器支持一種特定的方式,使該特定符號(hào)使用C調(diào)用約定來(lái)引用一個(gè)函數(shù),并且應(yīng)這樣處理?還有其他想法嗎?
查看完整描述

3 回答

?
躍然一笑

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可以使用C預(yù)處理器對(duì)程序集進(jìn)行預(yù)處理,并使用宏在Windows上添加缺少的下劃線。首先,您需要將程序集文件從bar.s重命名為bar.S(大寫(xiě)“ S”)。這告訴gcc使用cpp預(yù)處理文件。


要添加缺少的下劃線,您可以定義一個(gè)宏“ cdecl”,如下所示:


#if defined(__WIN32__)

# define cdecl(s) _##s

#else

# define cdecl(s) s

#endif

然后像這樣使用它:


.global cdecl(bar)

cdecl(bar):

    movl 4(%esp), %eax

    addl %eax, %eax

    ret

請(qǐng)注意,Mac OSX還需要前劃線,因此您可以像這樣更新宏的第一行:


#if defined(__WIN32__) || defined(__APPLE__)



查看完整回答
反對(duì) 回復(fù) 2019-12-16
  • 3 回答
  • 0 關(guān)注
  • 572 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)