背景:

为了学习嵌入式,最近除了下载了 arm-linux-gcc,还需要编译 gdbserver,但是机子上的 gcc 无法编译,于是只好按 mooc 里的使用旧版本的 gcc 进行编译。

设备及软件信息:

VMware Workstation 15 Pro

Ubuntu 18.04

gcc-7.5.0

目的:

编译安装 gcc-4.7.4

详细过程:

1. 下载需要的源码包到当前目录

gcc-4.7.4.tar.gz    mpfr-2.4.2.tar.bz2    gmp-4.3.2.tar.bz2    mpc-0.8.1.tar.gz

这一部分比较简单,不再赘述。需要注意的是当前版本 gcc 依赖软件的版本在 ./gcc-4.7.4/contrib/download_prerequisites 可以查阅,虽然官方推荐的是用这个脚本下载,但实际上似乎下载不了,故手动下载。

2. 创建需要的目录

需要创建 ./gcc-4.7.4/    ./gcc_build/

3. 下载一部分补丁到当前目录(行号对不上时可自行手动修改)

cfns.h.patch:用来修补 ./gcc-4.7.4/gcc/cp/cfns.h

@@ -53,6 +53,9 @@  __inlinestatic unsigned int hash (const char *, unsigned int);#ifdef __GNUC____inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif#endifconst char * libc_name_p (const char *, unsigned int);/* maximum key range = 391, duplicates = 0 */

cfns.gperf.patch:用来修补 ./gcc-4.7.4/gcc/cp/cfns.gperf

@@ -22,6 +22,9 @@  __inlinestatic unsigned int hash (const char *, unsigned int);#ifdef __GNUC____inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif#endifconst char * libc_name_p (const char *, unsigned int);%}

patch-gcc46-texi.diff:用来修补 ./gcc-4.7.4/gcc/doc/gcc.texi

--- ./gcc/doc/gcc.texi.orig 2017-03-01 16:56:48.000000000 -0800
+++ ./gcc/doc/gcc.texi  2017-03-01 17:03:38.000000000 -0800
@@ -86,9 +86,15 @@@item GNU Press@tab Website: www.gnupress.org@item a division of the
-@tab General: @tex press@@gnu.org @end tex
+@tab General:
+@tex
+press@@gnu.org
+@end tex@item Free Software Foundation
-@tab Orders:  @tex sales@@gnu.org @end tex
+@tab Orders:
+@tex
+sales@@gnu.org
+@end tex@item 51 Franklin Street, Fifth Floor@tab Tel 617-542-5942@item Boston, MA 02110-1301 USA
@@ -108,6 +114,7 @@@sp 1@insertcopying

4. 进行预处理

因为前前后后编译失败了很多次,所以每次把所有操作再做一遍很费事,因此在当前目录下写了个脚本 aaa.sh。

下面我会对脚本进行一定讲解,具体安装时可能每个人都要做一定的调整。

aaa.sh:

sudo rm -rf ./gcc-4.7.4/*
sudo rm -rf ./gcc_build/*
sudo tar zxf gcc-4.7.4.tar.gz
sudo cp mpfr-2.4.2.tar.bz2 ./gcc-4.7.4/
sudo cp gmp-4.3.2.tar.bz2 ./gcc-4.7.4/
sudo cp mpc-0.8.1.tar.gz ./gcc-4.7.4/
sudo patch -p0 ./gcc-4.7.4/gcc/cp/cfns.h cfns.h.patch
sudo patch -p0 ./gcc-4.7.4/gcc/cp/cfns.gperf cfns.gperf.patch
sudo patch -p0 ./gcc-4.7.4/gcc/doc/gcc.texi patch-gcc46-texi.diff
echo
find ./gcc-4.7.4/lib* -type f -name *.h | xargs grep -n " ucontext_ "
find ./gcc-4.7.4/lib* -type f -name *.h | xargs sudo sed -i "s/ ucontext_ / ucontext_t /g"
echo
find ./gcc-4.7.4/lib* -type f -name *.h | xargs grep -n " ucontext_$"
find ./gcc-4.7.4/lib* -type f -name *.h | xargs sudo sed -i "s/ ucontext_$/ ucontext_t/g"
echo
find ./gcc-4.7.4/lib* -type f -name *.h | xargs grep -n "struct ucontext "
find ./gcc-4.7.4/lib* -type f -name *.h | xargs sudo sed -i "s/struct ucontext /ucontext_t /g"
cd gcc-4.7.4
sudo sed -i "/wget/d" ./contrib/download_prerequisites
sudo ./contrib/download_prerequisites
cd ../gcc_build

第1~2行是清理目录,每次编译失败都要清理这两个目录。

第3~6行是解压 gcc 并且将需要的包拷进 gcc 目录下。第20行是把这个脚本中带有 wget 的行删除,因为我们已经把这些包手动下载了。第21行是执行它自带的这个脚本,这个脚本实际上做的也是解压工作。这里强烈建议用我这种方式把这3个包放进 gcc 目录里,而不是放到外面解压并手动编译,许多教程以及我看的 mooc 都是这么做的,但是这种行为被 GNU 官方 称为非常的 silly

第7~9行把我刚刚说的3个补丁打上,没有的话 make 的时候会有 error。当然你也可以注释掉试试,说不定你的版本就没这个问题。

echo 换行不解释。

第11~18行是为了替换 struct ucontext。这个应该是已经不支持了,现在用的是 POSIX 标准的 ucontext_t。可以参考 Use ucontext_t not struct ucontext in linux-unwind.h files 。之所以写了3组是为了适应不同的情况,这个地方其实也可以打补丁,但是我觉得用命令行替换更好更方便。其中第3组是网上许多补丁完成的功能,但是在我的机子上有些特殊的情况比如 struct uncontext_ 这种,还有一些文件那些补丁没有覆盖到,所以使用了 find 命令进行查找。

第22行前往编译目录。

4. 进行编译

可以先创建个 log 文件,一会儿把 make 的屏幕输出重定向到这。

进入当前目录,执行 source ./aaa.sh 预处理,执行后自动进入 ./gcc_build,现在就要开始 configure、make、make install 组合拳了。

执行

sudo ../gcc-4.7.4/configure --prefix=/opt/gcc-4.7.4 --disable-multilib --disable-nls --enable-shared --enable-__cxa_atexit --enable-threads=posix --enable-language=c,c++ --enable-checking=release

语言你自己选,路径就是这个路径,其他参数反正我这边使用正常,网上不同人的教程参数基本都不一样,自己斟酌。

官方对配置参数有详细的解释:Installing GCC: Configuration

注意:我一直说的当前目录也就是 . 在我的机器上是 /opt,在这条命令里为了安全我使用的是绝对路径。

这条命令执行后应该成功创建了 Makefile。

执行

su
time make -j4 > /opt/log 2>&1

time 是为了计时,你也可以不要,后面的这个是把屏幕输出重定向到 /opt/log,也不是必要的。本质上就是 make -j4。

正常情况(一般都不正常)下可以编译成功,我用了40多分钟。有问题的话看 /opt/log 进行排查,就看最后10来行,找 error,或者直接执行

grep -n error: /opt/log

进行 debug。排查修改完后重新进行第4步,先预处理,然后……

5. 安装

执行

sudo make install

即可。

gcc4.7.4降级编译相关推荐

  1. IDEA java版本降级编译,解决JDK版本导致Unsupported major.minor version 52.0 error

    Intellij IDEA使用教程相关系列 目录 具体的操作,这位博友整理得很详细https://blog.csdn.net/huyishero/article/details/61916516 补充 ...

  2. arm linux gcc 4.6.3,编译gcc-4.6.3

    编译gcc-4.6.3 准备 下载GCC 源码包 : gcc-4.6.3.tar.bz2 下载GCC 依赖包: gmp-5.0.4.tar.bz2, mpfr-3.1.0.tar.bz2 ,mpc-0 ...

  3. centos6编译安装MYSQL8_CentOS 6.4编译安装MySQL8.0

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...

  4. ASan(Linux),gcc4.8以上版本自带的内存检查工具

    转自:http://shafeng.github.io/2017/05/10/asan/ 最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了 ...

  5. linux编译c++11的代码

    C++11,(即ISO/IEC 14882:2011),是目前的C++编程语言的最新正式标准.它取代了第二版标准(第一版公开于1998年,第二版于2003年更新,分别通称C++98以及C++03,两者 ...

  6. ubuntu16.04 gcc降级到4.8

    一.安装方式 1. 使用  apt-get方式安装 sudo apt-get install gcc-4.8 2.本地编译安装 apt source gcc-4.8 cd gcc-4.8 ./cont ...

  7. 前端架构设计第六课工程化构建、编译、运行

    12 如何理解 AST 实现和编译原理? 经常留意前端开发技术的同学一定对 AST 技术不陌生.AST 技术是现代化前端基建和工程化建设的基石:Babel.Webpack.ESLint.代码压缩工具等 ...

  8. Swift编译 SIL分析

    文章目录 Swift编译 & SIL分析 1.Swift与OC编译区别 2.Swift编译流程 3. swiftc命令 4. SIL分析 1.创建项目,在`main.swift`写入以下代码: ...

  9. Raspberry PI 编译WLan驱动模块, 并配置登录WIFI

    1. 硬件说明: 手头的Raspberry PI 还是1代 B+型号. 出入无线网卡型号: Comfast, CF-WU835P, 树莓派一点反映都没有. windows下插入网卡, 提示芯片型号为: ...

最新文章

  1. 使用VMwork Station Pro 14 安装CentOS7.6详细教程
  2. python无法处理特别大的数据文件_Python实现快速大文件比较代码解析
  3. 美国AI语音大牛转投小米!因政治正确遭名校JHU开除,其后怒拒FB百万美元合同...
  4. AngularJS API
  5. Switch命令汇总
  6. 解决客户端从服务器请求数据乱码问题
  7. oracle开窗函数是什么,ORACLE数据库(六)-----开窗函数
  8. java float f1=0.5_Java Math类静态float copySign(float f1,float f2)与示例
  9. [渝粤教育] 西南科技大学 建筑制图 在线考试复习资料
  10. arcgis xml 下载 切片_xml格式文件如何用arcgis进行编辑和更新
  11. JavaBean和Servlet
  12. 高度固定 宽度裁剪_高领落肩连衣裙的制版裁剪教程才智服装
  13. luaprofiler探索
  14. 破解电信光猫 HG6201T 超管账号密码 (C语言源代码)
  15. DedeCMS总是提示验证码不正确的解决方法
  16. fid和is_【GAN】用于生成图像的评价指标——IS和FID
  17. java面试最后问面试官什么问题,详细说明
  18. 程序之外_与我长跑十年的女朋友嫁人了(转)
  19. 七夕节表白3d相册制作
  20. 分分搞懂c#中的委托

热门文章

  1. QT+OpenCv4编译过程,解决mingw32-make -j报错。
  2. 推荐一个 Github 上最全的C语言教学
  3. 正则表达式及bash脚本(一)
  4. Mac电脑如何转化二维码?方法了来了
  5. AUTOSAR 网络管理NM
  6. 设计模式——策略模式
  7. Tomcat配置HTPPS访问
  8. Windows添加自定义开机启动项
  9. java源码——计算立体图形的表面积和体积
  10. selenium——爬取qq空间说说