在64位linux系统上构建32位代码(kubuntu 18.04)

时间:2020-05-01 18:44:33

标签: gcc 32bit-64bit

我正在考虑将32位AIX应用程序移植到linux-在我的64位Kubuntu桌面系统上做概念验证。我想我可以在64位模式下构建该应用程序,但是我担心某些东西可能会损坏(有成千上万个模块-这是整个应用程序系统)。

无论如何,我尝试构建一个简单的应用程序,它只是printf的sizeof int,short和long变量。当我使用“ cc test / c”构建它时,它可以工作,并且sizeof报告很长的8字节-因此它默认为64位模式。但是当我尝试使用'cc -m32 test.c'构建它时,它将无法编译。

In file included from test.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
 #include <bits/libc-header-start.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

因此/usr/include/stdio.h确实包含对bits / libc-header-start.h的引用,并且没有/ usr / include / bits子目录。但是,如果那是错误,为什么在没有-m32标志的情况下运行它时,编译器为什么不抱怨呢?我在stdio.h的#include周围没有看到任何条件逻辑,那么我缺少什么魔术呢?是否还有另一个/ usr / include树通过-m32标志调用?

此处的各种文章都讨论了在64位计算机上构建32位的问题,但它们是较旧的文章,并引用了较旧的ubuntu基础。无论如何,他们建议确保已加载正确的库。我已经有了这些(如果它们已经存在,我应该认为我的32位构建环境应该还可以)。还有其他我想念的东西吗?

lib32gcc-4.8-dev/bionic 4.8.5-4ubuntu8 amd64
gcc-multilib/bionic-updates,bionic-security 4:7.4.0-1ubuntu2.3 amd64

好的,我看到在/ usr / include / x86-64-linux-gnu下有一个“ bits”目录,但在非64bit环境下没有并行的目录。

$ locate libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h

那我该怎么安装呢?我已经安装了这些软件:

libc6-dev-i386/bionic 2.27-3ubuntu1 amd64
libc6-dev-i386-amd64-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.1 all
libc6-dev-i386-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.1 all
libc6-dev-i386-x32-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.2 all

1 个答案:

答案 0 :(得分:0)

原来,我不得不安装gcc-multilib和g ++-multilib来获取缺少的东西。现在可以使用。

很抱歉,这是一个古老的旧问题。再说一次,可能有人需要此信息。

糟糕。这样就足以构建一个普通的应用程序,但是当我尝试构建使用'curses'的真实应用程序时,-lcurses最终试图引入-ltinfo,而ld抱怨说:

/usr/bin/ld: skipping incompatible //usr/lib/x86_64-linux-gnu/libtinfo.so when searching for -ltinfo

我不直接叫“ ld”。我的链接语句是对'cc -g -m32 ...'的调用,也就是说,我指望CFLAGS生成32位二进制文​​件,但是链接程序仍在尝试提取64位内容。我尝试直接调用“ ld”,但它不喜欢-m32标志。说这是“不兼容的仿真模式”。

构建32位二进制文​​件真的可行吗?还是我最好将配置调整为仅将linux视为64位平台,然后尝试使其工作...?