如何让OpenWatcom编译的C函数将double返回值存入ST(0)?
问题:OpenWatcom编译i386 Linux程序时修改double返回值的寄存器约定
给定C函数:
double retfp(void) { return 42; }
使用OpenWatcom C编译器针对Linux i386平台编译,编译命令为:
owcc -blinux -fno-stack-check -fsigned-char -march=i386 -Os -W -Wall -Wextra -Werror -mregparm=0 -c -o retfp.owcc.obj retfp.c
当前生成的代码会将double类型返回值存入EDX:EAX寄存器,但希望像GCC那样,将返回值存入ST(0)寄存器,是否可通过OpenWatcom的命令行参数实现?
解决方案
可以通过添加-mabi=sysv编译参数实现。
OpenWatcom默认在Linux i386平台的ABI约定与GCC采用的System V i386 ABI存在差异:前者将double返回值存入通用寄存器对EDX:EAX,后者遵循System V ABI规范,使用FPU寄存器ST(0)返回浮点类型值。添加-mabi=sysv参数后,编译器会强制遵循System V i386 ABI,从而让double返回值存入ST(0),与GCC行为一致。
修改后的编译命令为:
owcc -blinux -fno-stack-check -fsigned-char -march=i386 -Os -W -Wall -Wextra -Werror -mregparm=0 -mabi=sysv -c -o retfp.owcc.obj retfp.c
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

