在赵炯的《Linux内核完全剖析》中有一个在C程序中调用汇编函数的介绍
执行as -o callee.o callee.s的时候遇到错误 “callee.s:7: Error: invalid instruction suffix for `push'”, 参考文章 :http://www.2cto.com/os/201310/253276.html (感谢作者)。在callee.s中加入 .code32
执行完gcc -o caller caller.c callee.o后,运行./caller就报段错误(Segmentation fault (core dumped))。尝试用gdb调试了一下,没有指明具体位置,只报出函数名。
把caller.c编译成caller.s,看了下源代码,发现用的是rbp(64位),而callee.s用的是ebp(32位)
参考网上的说法,应该在编译的时候加上 -m32 以生成32位代码
先尝试生成32位的编译程序:gcc -S -m32 -o caller.s caller.c
In file included from /usr/include/stdio.h:27:0,
from caller.c:1:
/usr/include/features.h:367:25: fatal error: sys/cdefs.h: No such file or directory
compilation terminated.
网上查了下是缺少32位兼容包
64位机的32兼容包参考链接:http://www.cnblogs.com/chobits/p/4264724.html (感谢作者)
运行:gcc -m32 -o caller caller.c callee.s (会有警告)
运行:./caller
看到结果了。。