64位linux编译32位程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了64位linux编译32位程序相关的知识,希望对你有一定的参考价值。

如何编译?
使用的是openSUSE。

在64位的Linux下,gcc 编译 32 位程序需要添加参数 -m32 ,ld需要添加参数是 -m elf_i386。
1、Along with the -m32 flag in gcc, you may need to include the -melf_i386 flag for ld to properly link the 32bit object files to the 32bit libraries if you have both the 32bit and 64bit libraries.
2、 ld命令 ld命令是GNU的连接器,将目标文件连接为可执行程序。
3、举例:

gcc -m32 -o hello hello.c

gcc -m32 -c hello.o hello.c
ld -m elf_i386 -o kernel main.o hello.o
参考技术A 这个比较麻烦。
首先你要装好全套的 32 位对应的开发编译支持环境和对应的运行环境,之后还要设置你这个软件编译时用 32 位的参数和 32 位的编译器。

你这个其实等同于交叉编译。追问

使用gcc编译加上-m32就可以了。

追答

不全是

追问

可否具体一些?
加-m32编译和直接在32位系统下编译有什么区别?

追答

32 位系统,整个系统环境都是 32 位的。
-m32 是让 gcc 输出为 32 位的程序,但你需要保证整个需要的函数库也都是 32 位的,不然会出现链接库找不到的情况,而且有些系统,32 位函数库都放在 /lib32 和 /usr/lib32 里面,这个位置又和 32 位系统的地址不一样,不过这个问题一般没事,因为系统动态的会去找位置。
主要问题是 64 位环境下面,很多程序和函数库都是 64 位的,32 位的不一定全。

本回答被提问者采纳
参考技术B 装openSUSE 下32位需要的开发包追问

可否具体一些?

编译 64 位 Linux 的 32 位 GTK+ 应用程序

【中文标题】编译 64 位 Linux 的 32 位 GTK+ 应用程序【英文标题】:Compiling 32-bit GTK+ Applications of 64 bit Linux 【发布时间】:2012-01-05 17:22:56 【问题描述】:

我在 64 位 Linux,特别是 Ubuntu 10.04 上编译 32 位 GTK+ 应用程序时遇到了一些问题。编译 64 位 GTK+ 应用程序可以正常工作,并且所有设置都可以编译 32 位应用程序,但它不适用于 GTK+

我有一个非常简单的测试程序,用于排除故障,它只是一个 gtk_init 和一个 gtk_main,可以编译为 -m64。我正在用 gcc 4.6.2 编译,调用它:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

这是我收到的两种不同类型的错误消息:

/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../x86_64-unknown-linux-gnu/bin/ld: warning: libXext.so.6, needed by /usr/lib/../lib32/libgtk-x11-2.0.so, not found (try using -rpath or -rpath-link)

/usr/lib/../lib32/libgdk-x11-2.0.so: undefined reference to `XmbSetWMProperties'

请记住,这些不是唯一的错误,我只是包含了两个特定类型以供参考,为了简短起见,我得到了整个 GTK+ 库堆栈的错误。

我的 lib32 文件夹中确实有所有正确的 32 位版本的库。

希望有人以前遇到过这个问题并且可以帮助我,这真的让我很头疼,我在网上的任何地方都帮不上什么忙。

请询问您是否需要我提供任何其他信息来帮助诊断此问题。

注意:我确实有 ia32-libs 和 gcc-multilib 包。 Ubuntu 10.04 没有单独的 ia32-libs-gtk 包,但我认为这些都包含在 ia32-libs 包中。它们都存在于我的系统中。

我认为这一定是某种链接器配置问题。我最近构建了新的 Free Pascal 编译器和 32 位交叉编译器,我还将 GCC 升级到 4.6.2 以利用一些新的 C++ 特性和对 C99 支持的修复。我的系统上仍然存在默认的 4.4.3 GCC。我认为问题出现的地方是我安装了一个新的 binutils,因为我一直在尝试使用 Clang 和 LLVM 作为工具链,并且我想要插件功能,所以我想不妨升级它们。

编译 64 位程序一切正常,新工具根本没有出现任何问题,我可以编译 32 位程序,但是当需要显式链接某些内容时,我遇到了问题。

我知道我当前的库集是合适的,并且我安装了仅发出 32 位代码的 Free Basic,并且在此升级之前我能够构建 32 位 GTK+ 程序没有问题。

只是想知道是否有人知道在此升级中可能更改了哪些配置,或者以前发生过这种情况?我真的应该升级到更新的发行版,这样我就可以利用所有新软件而不必破解我所有的软件包,但不幸的是,新内核中有一个错误会阻止我的计算机从待机状态恢复,并且这是我用于个人项目的笔记本电脑,所以适当的电源管理非常重要,如果我把系统弄坏了,这不是一个巨大的损失,除了我把它设置得非常适合我的工作流程。

【问题讨论】:

【参考方案1】:

您可以告诉pkg-config 使用环境变量PKG_CONFIG_PATH 搜索32 位库。 对于 Ubuntu:

export PKG_CONFIG_PATH=/usr/lib32/pkgconfig:$PKG_CONFIG_PATH

对于红帽:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

【讨论】:

【参考方案2】:

我认为你需要安装 ia32-libs-gtkgcc-multilib 包,并且你需要像你已经做的那样编译和链接 gcc -m32

【讨论】:

【参考方案3】:

12.04 中的 GTK 包似乎无法与多架构一起正常工作。您可以通过创建以下符号链接在 Ubuntu 12.04 上解决此问题:

sudo ln -s /lib/i386-linux-gnu/libglib-2.0.so.0 /usr/lib32/libglib-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 /usr/lib32/libgtk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 /usr/lib32/libgdk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libatk-1.0.so.0 /usr/lib32/libatk-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpangox-1.0.so.0 /usr/lib32/libpangox-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpango-1.0.so.0 /usr/lib32/libpango-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 /usr/lib32/libgmodule-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 /usr/lib32/libgobject-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 /usr/lib32/libgdk_pixbuf-2.0.so

我在这个帖子里找到了答案:http://www.blitzbasic.com/Community/posts.php?topic=101357

或者(可能更好),您可以保持基本系统不变并更新您的链接以按文件名而不是库名搜索。比如:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` -L/usr/lib/i386-linux-gnu -l:libgio-2.0.so.0 ...

这不是很好。您必须为链接器找不到的每个库添加-l:,如果库文件名发生更改,您的构建将中断。

【讨论】:

以上是关于64位linux编译32位程序的主要内容,如果未能解决你的问题,请参考以下文章

64位linux编译32位程序

如何用GCC编译64位linux程序

gcc:在 32 位平台上编译 64 位二进制文​​件

ubuntu16 64位 编译64位程序和32位程序

强制 gcc 在 64 位平台上编译 32 位程序

64位SUSE编译32位程序出错