小编Mak*_*ver的帖子

在Win32上使用GCC将前导下划线添加到装配符号?

我有一段C代码调用程序集中定义的函数.举个例子,假设foo.c包含:

int bar(int x);  /* returns 2x */
int main(int argc, char *argv[]) { return bar(7); }
Run Code Online (Sandbox Code Playgroud)

并且bar.s包含x86程序集中bar()的实现:

.global bar
bar:    movl 4(%esp), %eax
        addl %eax, %eax
        ret
Run Code Online (Sandbox Code Playgroud)

在Linux上,我可以轻松地使用GCC编译和链接这些源,如下所示:

% gcc -o test foo.c bar.s
% ./test; echo $?
14
Run Code Online (Sandbox Code Playgroud)

在使用MinGW的Windows上,此操作失败并显示"未定义引用"栏'的错误.事实证明,在Windows上,所有具有C调用约定的函数标识符都以下划线为前缀,但由于"bar"在汇编中定义,因此它不会获得此前缀并且链接失败.(所以错误信息实际上是抱怨错过了符号_bar,而不是吧.)

总结一下:

% gcc -c foo.c bar.s
% nm foo.o bar.o
foo.o:
00000000 b .bss
00000000 d .data
00000000 t .text
         U ___main
         U _bar
00000000 T _main

bar.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T …
Run Code Online (Sandbox Code Playgroud)

c assembly winapi gcc mingw

29
推荐指数
3
解决办法
2万
查看次数

标签 统计

assembly ×1

c ×1

gcc ×1

mingw ×1

winapi ×1