编辑:看起来问题是Windows子系统无法处理32位。
我是一个汇编和Linux新手,正在尝试在Windows上的64位Ubuntu上编译32位汇编(AT&T语法)。我的情况几乎与此其他stackoverflow问题完全相同,但那里的解决方案(我在许多其他帖子中看到重复)对我不起作用,原因不明。我正在学习《从底层开始编程》这本书中的x86汇编,但我无法在Windows上的Bash on Ubuntu上编译程序。
我尝试了多种命令选项的组合,有些似乎可以编译,但我要么无法执行二进制文件(格式错误),要么可以执行但在源文件的
没有
仍然没有
然后,我可以尝试使用
我是一个汇编和Linux新手,正在尝试在Windows上的64位Ubuntu上编译32位汇编(AT&T语法)。我的情况几乎与此其他stackoverflow问题完全相同,但那里的解决方案(我在许多其他帖子中看到重复)对我不起作用,原因不明。我正在学习《从底层开始编程》这本书中的x86汇编,但我无法在Windows上的Bash on Ubuntu上编译程序。
我尝试了多种命令选项的组合,有些似乎可以编译,但我要么无法执行二进制文件(格式错误),要么可以执行但在源文件的
movl 8(%ebp), %eax
处出现分段错误(我读到这可能是由于在64位环境中设置32位堆栈导致的)。没有
.32code
作为我的程序的第一行,使用as
的--32
选项时,没有任何有用的尝试:没有.32code和有--32(不能嵌入图像在我的帖子中所以放链接)。仍然没有
.32code
,现在使用了--x32
(没有.32code和有--x32),我发现如果不包括.32code
,它会出现推送、弹出等问题。因此,在我的源文件中包含它:有.32code和有--x32。然后,我可以尝试使用
gcc
而不是as
和ld
进行类似的尝试,但我不确定是否有意义包括所有不同的失败组合并打开那个罐子,因为这样我们就会涉及到gcc是否具有所需的库(?)。例如,使用gcc -m32 -nostdlib factorial.s -o factorial
,我得到“无法执行二进制文件:执行格式错误”的消息,无论是否有.32code
。尝试诸如sudo apt-get install lib32gcc-4.8-dev
和其他尝试,没有什么能够工作,很多时候我遇到了关于qemu-user-static
的问题,可能是因为我曾经安装过它,现在它都乱了。
有一个答案建议只安装32位gcc,但这对我似乎没有任何作用。另一个解决方案可能是将书中的所有示例手动转换为64位,并忘记所有这些。我想这意味着重新构想堆栈以包含8个而不是4个(即像4(%esp)
这样的东西将变成8(%esp)
),但也可能会更改一些movl
到movq
,例如,或一些%eax
到%rax
等。但我觉得应该有一些解决方法,特别是2013年张贴者似乎已经解决了确切的问题。也许我需要尝试使用像-march=CPU[+EXTENSION...]
或-mtune=CPU
之类的东西?也许我只是缺乏关于架构、Linux或as/gcc的基本知识?
ld -melf_i386
是正确的仿真方式。 - Jester.32code
,但是as --32
和as --x32
都不起作用。然后,删除.32code
并重试这两个as
选项也不起作用:点击这里。 - Jaime Salazar