linux - 在 Windows 上的 64 位 Ubuntu 上编译 32 位程序集

标签 linux ubuntu gcc assembly x86

<分区>

编辑:看起来问题在于适用于 Linux 的 Windows 子系统无法处理 32 位。

此处的汇编和 Linux 新手尝试在 Windows 上的 64 位 Ubuntu 上编译 32 位汇编(AT&T 语法)。我的情况实际上是 this other stackoverflow question 的精确复制品但出于某种原因,那里的解决方案(我在许多其他帖子中重复看到)对我不起作用。我正在通过从头开始编程这本书学习 x86 汇编,但我无法在 Windows 上的 Ubuntu 上的 Bash 上编译程序。

我在我的命令中尝试了多种选项组合,有些显然可以编译,但我要么无法执行二进制文件(格式错误),要么我可以但是当我到达 movl 8(%ebp), %eax in my source file (我读到这可能是由于在64位环境中设置了32位堆栈)。

没有 .32code 作为我程序的第一行,并且 as 有一个 --32 选项,没有尝试 ld 产生任何有用的东西:without .32code and with --32 (还不能在我的帖子中嵌入图片,所以用链接代替)。

仍然没有 .32code 而现在有 --x32 ( without .32code and with --x32 ) 我发现如果你不这样做的话,它在推送、弹出等方面有问题包含 .32code 所以我将它包含在我的源文件中:with .32code and with --x32 .

然后,我可以用 gcc 而不是 asld 进行类似的尝试,但我不确定它是否有意义包括所有不同的失败组合并打开蠕虫 jar ,因为这样我们就可以了解 gcc 是否具有它需要的库(?)。例如,使用 gcc -m32 -nostdlib factorial.s -o factorial 我得到“无法执行二进制文件:Exec 格式错误”消息,有或没有 .32code。尝试诸如 sudo apt-get install lib32gcc-4.8-dev 之类的尝试,似乎没有任何效果,而且很多时候我都遇到了 qemu-user-static 的问题可能是因为我曾经安装过它,但现在全是 f%^#!d。

一个答案建议只安装 32 位 gcc,但这似乎对我没有任何作用。另一种解决方案是手动将书中的所有示例转换为 64 位,然后忘记所有这些。我想这意味着重新设想堆栈包含 8 个而不是 4 个(即 4(%esp) 之类的东西会变成 8(%esp))但是例如,也可能将一些 movl 更改为 movq,或者将一些 %eax 更改为 %rax 等。但是我觉得应该有一些解决方案,尤其是 how the poster in 2013似乎解决了确切的问题。也许我需要用 -march=CPU[+EXTENSION...]-mtune=CPU 之类的东西再试一次?也许我只是缺乏架构、Linux 或 as/gcc 方面的基础知识?

最佳答案

我认为您的汇编器工作正常。如果你想链接已安装的 glibc 版本,你需要确保安装开发包的 i386 版本(可能是 libc6-dev:i386,但也可能是 libc6- dev-i386 取决于分发版本),并与 gcc -m32 链接以获得正确的路径。 gcc 编译器驱动程序将使用适当的标志为您调用 ld

您可以通过使用 gcc -m32 编译和链接一个小的 C 文件来验证您的设置是否有效。这应该会生成一个 32 位程序。

关于linux - 在 Windows 上的 64 位 Ubuntu 上编译 32 位程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378617/

相关文章:

c# - .Net Core 忽略环境变量 DOTNET_SKIP_FIRST_TIME_EXPERIENCE

linux - 更改除一个文件夹之外的所有文件夹的所有者

python - 在 python 2 和 python 3 上卸载 openCV

c++ - gcc include命令坏了?

c++ - 为什么 std::generate 可以在没有命名空间限定符的情况下访问?

编译器错误消息定制

regex - 如何 grep 包含两次或多次列出特定字母的单词列表?

linux - fhem界面未启动

linux - rabbitmq-server : Depends: socat but it is not going to be installed. 无法安装rabbitMQ

ubuntu - Camunda - 禁用每次启动都创建演示用户?