我怎样才能在我的64位机器上用gcc编译一个32位的.o文件?

试图学习NASM大会。 我有一个64位的机器,与Ubuntu。 最近我决定testingpushpop指令。 我这样做:

 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 

我不太明白这里的错误。 如何在我的64位机器上testingpushpop ,如果显然我不能编译32位程序?

怎么样“-m32”? 我想你需要关心依赖库(如libc),请参阅: 从64位应用程序使用32位共享库?

首先,您可以使用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 。 你有选择,但他们必须相互兼容。

怎么样“-march = i386”? 请参阅: http : //gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html