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

时间:2013-09-13 03:54:14

标签: linux gcc assembly nasm

尝试学习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 个答案:

答案 0 :(得分:3)

“-m32”怎么样? 我认为您需要关心依赖库(例如libc),请参阅:Use 32bit shared library from 64bit application?

答案 1 :(得分:2)

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

64位代码使用不同的系统调用号,将参数放在不同的寄存器中,并使用syscall代替int 0x80。但是,旧的int 0x80接口与旧系统中的旧系统调用号和参数仍然有效。这给你一些“混合”代码,可能不是一个好主意,但它的工作原理。任何人都猜测它将在未来的内核中继续工作多久。你可能最好学习“正确的”64位代码。

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

答案 2 :(得分:0)