如何在64位机器上使用gcc编译32位的.o文件?

3
尝试学习NASM汇编。我使用64位Ubuntu机器。最近,我决定测试pushpop指令。我这样做:
nasm -felf64 Test.asm

显然在64位模式下它们不受支持。好的,没问题,我只需要在32位模式下做就行了。
nasm -felf Test.asm

现在,如往常一样,
gcc Test.o

但现在它告诉我
i386 architecture of input file 'Test.o' is incompatible with i386:x86-64 output

我不太明白这里的错误。如果显然我无法编译32位程序,那么我如何在我的64位机器上测试pushpop呢?

3个回答

3

2
首先,在64位代码中,您可以使用pushpop,但不能使用32位寄存器。如果您pushpop 64位寄存器,则可以正常工作。在大多数情况下,您可以在64位代码中使用32位寄存器,但不能使用pushpop。可能会有其他例外情况,但我不知道。

64位代码使用不同的系统调用号,在不同的寄存器中放置参数,并使用syscall而不是int 0x80。然而,旧的int 0x80接口仍然使用旧的系统调用号和旧寄存器中的参数。这给您带来了一种“混合”代码,可能不是一个好主意,但它确实有效。在未来内核中它能够继续工作多长时间还无法确定。您最好学习“正确”的64位代码。

但是,还有更多的32位示例可用。您可以告诉Nasm -f elf32(只是-f elf是别名,但出于清晰起见,我建议使用“全名”)。如果您使用gcc,请告诉它-m32。如果您直接使用ld,请告诉它-m elf_i386。您有选择,但它们必须相互兼容。


0

这可能不是答案,“march” 是关于优化的,而不是在编译时选择哪个平台。 - user2485710

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接