c - 如何使用 ia16-elf-g++ 编译器生成 fpu 代码(未模拟)?

标签 c gcc cross-compiling x86-16 fpu

我已经下载了 Sourcery IA16 compiler ,这是一个针对 16 位目标的 GNU C++ 编译器,并且它可以工作(尽管它不支持远指针,并且在内联 asm 寄存器分配方面存在一些故障,等等)。

但是当我在 C 中声明一个 float 变量时,编译器会说:

/tmp/ccBB3kEN.o: In function `foo()':
(.text+0x38): undefined reference to `__floatsisf'
/tmp/ccBB3kEN.o: In function `foo()':
(.text+0x44): undefined reference to `__mulsf3'
/tmp/ccBB3kEN.o: In function `foo()':
(.text+0x4c): undefined reference to `__fixsfsi'

如图所示,默认情况下,它想要使用soft-fpu,所以我认为,我应该添加一些编译器选项来生成 native FPU代码。但我失败了。

现在我正在使用编译器选项-march=i80186,帮助说明我应该向其添加一些后缀:

-march=CPU[,+EXTENSION...]
  Igenerate code for CPU and EXTENSION, CPU is one of:
  generic32, generic64, i386, i486, i586, i686,
  pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
  prescott, nocona, core, core2, corei7, l1om, k1om,
  iamcu, k6, k6_2, athlon, opteron, k8, amdfam10,
  bdver1, bdver2, bdver3, bdver4, znver1, btver1,
  btver2
EXTENSION is combination of:
  8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,
  (etc.)

看起来帮助文本不适用于 IA16,因为它不包含 16 位 CPU(但包含 32/64 位 CPU),并且扩展也不起作用,我已经尝试过 -行军=i8086,8087:

ia16-elf-g++: error: unrecognized command line option '-march=i8086,8087

其他选项,例如 -mhard-float 也不起作用。

ia16-elf-g++: error: unrecognized command line option '-mhard-float'

我的问题是:如何为此编译器设置 8086 + 8087 目标?如果不支持,是否有其他 C/C++ 编译器可以使用 FPU 代码生成 MS-DOS .com 输出(在 Linux 或 MacOS 平台上)?

最佳答案

文档位于 path/to/share/doc/sourceryg++-ia16-elf/man/man1/ia16-elf-g++.1

如果目标模拟器或设备不是 80{{,1}8{6,8},286} :-mfpmath=80387

请注意,ia16-elf-g{++,cc} 默认情况下会生成微型模型 .COM 文件。

您还可以尝试 -march=i8086+8087,但这可能仅适用于 as

关于c - 如何使用 ia16-elf-g++ 编译器生成 fpu 代码(未模拟)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46083682/

相关文章:

linux - 使用 gcc 指定目标

linux - 如何在 debian linux 中降级 gcc?

macos - gcc 不想在 mac 上使用 AVX

rust - 在带有 CPU arm926ej-s 的板上运行交叉编译的 HelloWorld 到 armv5te 时出现段错误

linux - Ubuntu 16.04 中的 Eclipse 交叉编译

c - 将两个指针交换为指针

c++ - 何时使用 C 浮点比较函数?

arm - 适用于 ARM 皮质 M4 的 Ocaml?

c - 在c中传递和分配指向void*的指针

c - 使用 RSA 算法加密-字母 'w' ,'x' ,'y' ,'z'