我有一段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)