升级 gcc 编译器/其他修复以实现向后兼容
Posted
技术标签:
【中文标题】升级 gcc 编译器/其他修复以实现向后兼容【英文标题】:Upgrade gcc compiler / other fix for backward compatible 【发布时间】:2017-03-21 09:45:43 【问题描述】:对于一个项目,我需要在旧硬件上升级应用程序,但使用的内核版本非常旧。并且编译当前的应用程序很痛苦。
全貌,对于一个项目,我们使用了带有 2.6.32 内核的 x86 板。(Debian) 使用 gcc 4.4.5 编译应用程序。 多年后,我们将 CPU 换成了 ARM7 和新内核 3.0.35 (buildroot) 使用 linaro-arm-linux-2013.01.(gcc 版本 4.7.3 20130102)
主要问题是代码现在基于 GCC 4.7.3,并且比 gcc 4.4.5 更多的是 C11。 本地编译不是一个选项,因为我的机器是 x64,目标是 x86。使用的包之一是 GTK2,这在 x86/x64 构建方法中不受支持。 x86 板的代码现在在较旧的虚拟机上编译。
如何在不重写程序以保留旧的 gcc 4.4.5 的情况下克服这个问题。开心吗?
升级 x86 板不是一个选项,因为我没有时间开发和测试它。
【问题讨论】:
如果您愿意花一些时间,您可以使用 x64 主机和 x86 目标制作一个 4.7.3 的“交叉编译器”。操作系统将是 Linux 2.6.32(libc 中的小调整)。构建交叉 gcc 时,您可以指定 glibc 以保持相同的部署版本。只有代码生成会发生变化,因此新的交叉可以与您部署的 4.4.5 基础兼容。否则,你需要修改你的代码才能编译。 这听起来像是一个计划,有什么建议可以在哪里寻找制作这个交叉编译器吗? 在此线程中:buildroot-busybox.2317881.n4.nabble.com/… Thomas Petazzoni 正在讨论为什么旧内核不可用。 那是 2.6.16,你的 2.6.32 应该没问题,因为它有 menuconfig 并且知道 header_install。使用旧版本的crosstool-ng.org 可能会更幸运。它也基于menuconfig。查看这些选项是否可用于您的内核和已部署的 libc。使用更旧的版本应该没问题,因为 linux/libc 尝试向后兼容。 刚刚检查过,甚至最新的 crosstool-ng 也支持 2.6.32.68(补丁级别无关紧要,但出于安全原因,您应该修补您的电路板)和 glibc 2.8。 【参考方案1】:尝试用那些 linaro arm 交叉编译器编译 hello.c:
看看 ./a.out 是否有效。
gcc-4.x
https://releases.linaro.org/components/toolchain/binaries/latest-4/
gcc-5.x
https://releases.linaro.org/components/toolchain/binaries/latest-5/
gcc-6.x
https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/
1.gcc-linaro-xxx-i686_arm-linux-gnueabi.tar.xz
2.gcc-linaro-xxx-x86_64_arm-linux-gnueabi.tar.xz
【讨论】:
【参考方案2】:我是如何解决这个问题的:
从这个网页获取 buildroot 文件:https://gist.github.com/icopitg-fh
获得 buildroot 版本 2013.11
构建内核 + 所需的软件包。请注意,由于 make 的版本,一些像 libc 会中断。我的版本是 4 并且配置脚本不接受找到的版本。这可以通过更改品牌来解决。 (更改正则表达式)。
【讨论】:
以上是关于升级 gcc 编译器/其他修复以实现向后兼容的主要内容,如果未能解决你的问题,请参考以下文章