首页
社区
课程
招聘
[原创]多版本gcc/g++共存方案
发表于: 2021-11-26 09:06 23135

[原创]多版本gcc/g++共存方案

2021-11-26 09:06
23135

有时需要进行交叉编译的时候,可能需要在高版本的架构上编译一个低版本的工具来运行到一个旧平台上。高版本的架构一般自带的都是高版本工具,这样编译出来的工具无法在低版本架构上运行,所以就有了多版本编译器共存的情况。这里我们以 gcc 为例简单说一下多版本 gcc 共存的解决方案,其实很简单。

在高版本的 Linux 上的源里是不能直接 apt 去安装低版本的 gcc/g++ 的,所以这里简单记录下如何在高版本的 Ubuntu 上也可以直接 apt 安装。

换源

既然高版本的源里没有安装包,直接更新一下低版本的源好了。以 gcc-4.8 为例,这里首先把 ubuntu 16.04 的源更新到 /etc/apt/sources.list中去:

然后 sudo apt update 一下,把包资源更新进来。

安装

可以先查看一下版本信息:sudo apt-cache policy gcc-4.8 ,作用类似于搜索,下面所有能安装的子版本都会列出来。然后直接 apt install 对应的版本即可。
这种方法不管想安装什么版本的旧软件,只要有对应的更新源即可。

第一种方法:

直接在使用时指定 CC 或 CXX,跟上对应版本的 gcc/g++ 的绝对路径即可。个人感觉这样会更方便一点,只要在编译的时候指定一下变量即可。

第二种方法:

设置优先级:

数字越大,表示优先级越高,上面的例子中就是优先使用 gcc-9 ,这个具体的数字不用特别关注,只要能体现出来大小来表达优先级就可以。

删除设置的优先级:

切换版本可以通过以下命令:

选择对应的数字即可,然后回车即可切换版本。

在使用 gcc-4.8 静态编译 gdbserver 的时候遇到错误:

解决办法其实很简单,在 make 之前进行文件 copy:

然后就可以加上-fPIC -static 参数进行静态编译。

make 完成之后,记得再改回来:

上述问题是 gcc 的一个 Bug,解决方案就如我们上面的操作一样。

# official
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
 
# 国内源aliyun
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
# official
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
 
# 国内源aliyun
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-11-26 09:14 被有毒编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (4)
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
如果libc的版本太高,低版本的gcc应该也运行不了吧
2021-11-27 17:54
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
3
TopC 如果libc的版本太高,低版本的gcc应该也运行不了吧
libc切版本好切,你直接指定就行了,方法有好几种。
2021-11-29 09:04
0
雪    币: 2827
活跃值: (2628)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4

可以考虑用docker,从4.8到最新都有 https://hub.docker.com/_/gcc?tab=tags&page=1&ordering=-last_updated

最后于 2021-11-30 22:12 被HOWMP编辑 ,原因:
2021-11-30 22:12
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
5
HOWMP 可以考虑用docker,从4.8到最新都有 https://hub.docker.com/_/gcc?tab=tags&page=1&ordering ...
嗯嗯,师傅好思路。主要是我的场景没办法用docker,就用原始方法了
2021-12-1 08:46
0
游客
登录 | 注册 方可回帖
返回
//