【问题标题】:How can I compile a 32-bit .o file with gcc in my 64-bit machine?如何在我的 64 位机器上使用 gcc 编译 32 位 .o 文件?
【发布时间】:2013-09-17 15:37:39
【问题描述】:

尝试学习 NASM 组装。我有一台带有 Ubuntu 的 64 位机器。最近我决定测试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

【问题讨论】:

  • stackoverflow.com/questions/5050186/push-and-pop-on-amd64 ,asm 语言真的非常依赖于平台,你永远不应该期望给定的关键字/寄存器/函数可以在任何平台上工作,如果发生它是免费的一餐,但通常有很多差异,即使在具有不同“位数”的相同操作系统下也是如此。
  • @user2485710:我明白了。这对于试图在家做事的学生来说不是很好:(

标签: linux gcc assembly nasm


【解决方案1】:

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

【讨论】:

    【解决方案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。您确实有选择,但它们必须相互兼容。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 这可能不是答案,march 是关于优化,而不是关于你想在编译时选择什么平台。
      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 2011-11-26
      • 2013-12-02
      • 2016-05-17
      • 2012-11-18
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多