GUN compiler collection源代码编译过程

2024-06-03 23:04

本文主要是介绍GUN compiler collection源代码编译过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一部分:

学习kernel需要了解编译的一些过程,为了详细理解GCC编译过程的原理,动手做了个sy,记录如下,有需要的童鞋可以参考。

1.环境:(均可,二次环境并非是WSL版本)

root@LAPTOP-X280:~# uname -r

5.15.146.1-microsoft-standard-WSL2

root@LAPTOP-X280:~# lsb_release -a

No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 22.04.3 LTS

Release:        22.04

Codename:       jammy

root@LAPTOP-X280:~# gcc -v

Command 'gcc' not found, but can be installed with:

apt install gcc

root@LAPTOP-X280:~#

2.Downloading the source 

从亚洲镜像站点下载:https://www.gnu.org/prep/ftp.html#asia

下载最新的版本:

NJU Mirror

The installation procedure itself is broken into five steps.

  1. Prerequisites 
  2. Downloading the source 
  3. Configuration 
  4. Building 
  5. Testing (optional)
  6. Final install 

来自 <Installing GCC- GNU Project>

0.解压缩文件

xz -cd gcc.13.0.tar.xz | tar xvf -

 mkdir objdir

1.Prerequisites  

apt install build-essential   //必须安装的基础编译,不如C和C++

//解决configure: error: no acceptable C compiler found in $PATH等问题

//实际上这个是安装了gcc,g++,make等工具的编译器了。

apt install libgmp-dev libmpfr-dev libmpc-dev libisl-dev //必须安装,按这里的先后顺序

3.Configuration 

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir# ../configure

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir# ../configure --disable-multilib

4.Building  

Building a native compiler

nproc

make -j$(nproc)

这个过程需要时间,而且top查看,开销很大,CPU基本都是耗尽。

若出现cpu等fetal error,可能就不需要使用-j的选项了,默认使用make即可

以下是WSL的资源使用:

Win11 的资源使用:

卡住在:…/gcc /explow.cc

后面出现fatal error

Ctrl+c终止进程,改为make -j6  记得6<nproc(8),资源也是很吃紧如下图:

还是卡住了:

/bin/bash ../../gcc/../move-if-change tmp-fixinc_list fixinc_list

echo timestamp > s-fixinc_list

….

最后尝试make把

先make distclean,

do ‘make distclean’ to delete all files that might be invalid.

再../configure --disable-multilib

Make  //19:10开始执行命令,完成时间:20:03终止

这时候的资源:

执行make -j8 开始执行时间:20:04,完成时间:21:10,出现fatal error

这时候的资源情况瞬间上升:

第二次改成make -j6,时间从21:21-21:46

这次OK了。

ps:(这里是第二次编译的,遇到磁盘空间不够的情况)

 磁盘空间不够的化使用命令:make -j4 bootstrap-lean

5.Testing (optional)   

The latest development sources are available via anonymous Git. Use the following command to clone a copy of the source tree:

     $ git clone git://git.sv.gnu.org/dejagnu.git

 cd dejagnu

./configure

 make

…出错解决:

apt install texinfo

make

 make install

cd objdir;

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir# make -k check

6.Final install 

 make install

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir# whereis gcc

gcc: /usr/lib/gcc /usr/local/bin/gcc /usr/local/lib/gcc /usr/share/gcc

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir# /usr/local/bin/g

cc -v

Using built-in specs.

COLLECT_GCC=/usr/local/bin/gcc

COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/13.3.0/lto-wrapper

Target: x86_64-pc-linux-gnu

Configured with: ../configure --disable-multilib

Thread model: posix

Supported LTO compression algorithms: zlib

gcc version 13.3.0 (GCC)

root@LAPTOP-X280:/usr/gcc-13.3.0/objdir#

第二部分:

使用gcc编译c程序

1.先设置环境变量

查看:

因为在root环境下编译的源代码,所以切换root下查看:

这里就可以直接使用gcc -v了,所以不需要设置环境变量。

关于环境变量的设置,查看/etc/profile或需要用到:

export HOME等命令, 如export PATH= 'echo $PATH':/root/linux

2.编译单个文件

ps,了解以下:

但是并不是说gcc编译c语言,g++编译c++。而是:gcc调用了C compiler,而g++调用了C++ compiler。主要区别在于:

  •     对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  •     对于 .c和.cpp文件,g++则统一当做cpp文件编译
  •     使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  •     gcc在编译C文件时,可使用的预定义宏是比较少的
  •     gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。
  •     在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。
  • gcc是GCC中的GUNC Compiler(C 编译器)
  • g++是GCC中的GUN C++ Compiler(C++编译器)

linux@LAPTOP-X280:~/cfile$ cat hello.c

#include <stdio.h>

int main(void)

{

        printf("hello,\nworld!\n");

        return 0;

}

缺省一步编译

linux@LAPTOP-X280:~/cfile$ gcc hello.c   //直接执行编译,会生产a.out的文件

linux@LAPTOP-X280:~/cfile$ ls

a.out  hello.c  hi.c

linux@LAPTOP-X280:~/cfile$ ./a.out    //执行a.out 二进制可执行文件

hello,

world!

linux@LAPTOP-X280:~/cfile$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, not stripped

指定一步编译:

inux@LAPTOP-X280:~/cfile$ gcc hello.c -o myhello

linux@LAPTOP-X280:~/cfile$ file myhello

myhello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, not stripped

linux@LAPTOP-X280:~/cfile$ ./myhello

hello,

world!

分步编译:

预处理:gcc -E hello.c -o hello.i  //-E(大写)只进行预处理

编  译: gcc -S hello.i -o hello.s   //-S(大写)只进行预处理和编译

汇  编: gcc -c hello.s -o hello.o  //-c 只进行预处理、编译和汇编

链  接: gcc    hello.o -o file   //指定生成的输出文件名为file

linux@LAPTOP-X280:~/cfile$ gcc -E hello.c -o h.i

linux@LAPTOP-X280:~/cfile$ cat h.i |wc -l

745

linux@LAPTOP-X280:~/cfile$ cat h.i

linux@LAPTOP-X280:~/cfile$ gcc -S h.i -o h.s

linux@LAPTOP-X280:~/cfile$ cat h.o |wc -l

27

linux@LAPTOP-X280:~/cfile$ cat h.o

linux@LAPTOP-X280:~/cfile$ file h

h: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, not stripped

linux@LAPTOP-X280:~/cfile$ ./h

hello,

world!

使用readelf -a h.o查看.o文件

3.编译多个文件

4.自动编译文件

这篇关于GUN compiler collection源代码编译过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028361

相关文章

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

SpringBoot整合InfluxDB的详细过程

《SpringBoot整合InfluxDB的详细过程》InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和... 目录一、简单介绍InfluxDB是什么?1、主要特点2、应用场景二、使用步骤1、集成原生的Influ

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti