在C程序中调用汇编函数

在赵炯的《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

看到结果了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值