gcc编译器源码(透过源码领悟GCC到底在干些什么 GCC源码分析)

:暂无数据 2026-10-11 22:00:29 :0

gcc编译器源码(透过源码领悟GCC到底在干些什么 GCC源码分析)

本篇文章给大家谈谈gcc编译器源码,以及透过源码领悟GCC到底在干些什么 GCC源码分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

透过源码领悟GCC到底在干些什么 GCC源码分析

 上半年一直在做有关GCC和LD的项目,到现在还没做完。最近几天编程的那台电脑坏了,所以趁此间隙写一点相关的分析和经验之类的跟大家共享。
  一、GCC的作用和运行机制
  GCC是Linux下重要的编译工具,用法这里就不说了,满大街都找得到。这里我重点介绍GCC的运作机制,作为代码分析的铺垫。全篇使用C语言子部件来作分析,因为我对其他语言的编译没有研究。
  根据编译原理,语言的编译分为这么几个步骤:词法分析、语法分析、语义分析、中间语言生成、优化、目标代码生成等。然而从编译器使用的角度来看,要把源代码翻译为可执行文件要经过编译和连接两步,与此对应,一个完整的编译系统一定包含编译器和连接器两大功能部件。编译器要完成编译原理中提到的那些任务;连接器要把编译器生成的代码片段拼接成一个完整的可执行程序。之所以需要连接器,是因为一般的程序都是多源文件的,而编译器一次只编译一个源文件(称之为翻译单元translation unit),因此需要连接器把所有翻译单元对应的输出合并成一个可执行文件。
  如果一切顺利,可执行程序就可以正确的生成出来。但是一旦源代码存在某些问题,错误就会被报告出来。编译器报告的错误一般都是局部错误,它会指明错误在哪个文件第几行;连接器报告的错误一般都是全局错误,而且绝大多数都是多胳膊少腿的问题,比如函数重定义,无法解决的外部符号等,这些错误无法定位到某一行。
  GCC就是这里的编译器。准确来说,GCC是一个编译驱动器,驱动cc1、as和ld三个部件完成编译、汇编和连接的工作。cc1将C语言源文件编译为汇编文件(.s)。而将汇编代码转换为二进制指令的工作由AS完成,生成大家都很熟悉的对象文件(.o);生成的这些对象文件再由AR程序打包成静态库(.a),或者由LD程序连接成可执行程序(elf、.so或其他格式)。而LD就是所谓的连接器。AS、AR、LD是属于另外一个叫做binutils的软件包的程序,所以要让GCC能够有效运作起来,除了在系统中安装GCC外,还要安装binutils才行。
  以下是cc1、as、ld各司其责的配合完成一个编译过程。
   view plaincopy
  gcc test.c -S -o test.S
  as test.S -o test.o
  ld test.o -o test
  通常所用的“gcc -c”就相当于“gcc -S” + as,而对于编译单个源文件一步到位生成可执行“gcc test.c -o test”相当于上面三个步骤的组合,中间文件被放置在临时目录下。从这一点看来,GCC除去编译的功能外,更像是个driver,它可以驱动as和ld完成整个的编译,特别是gcc也接受对象文件(.o)和静态库(.a)作为参数用于生成可执行程序,其实背后就是调用的LD,还可以用“-Wl,”选项给LD传递自定义参数。所以在大多数软件的Makefile里,你很难找到AS和LD的字眼,gcc已经给你包办了。
  GCC源代码里包含的主要就是cc1这部分(还包括一些其他的辅助工具,比如collect2等)。
  二、GCC的安装
***隐藏网址***
  一般来说,下载GCC是从GNU的FTP镜像网站去下载,gcc的代码包一般放置在/release/gcc-x.y目录下,而那三个依赖库一般放置在/infrastructure/目录下。
  1、把依赖库和GCC解包
   view plaincopy
  tar -vjxf gmp-4.3.2.tar.bz2 -C /usr/src/
  tar -vjxf mpfr-2.4.2.tar.bz2 -C /usr/src/
  tar -vxf mpc-0.8.1.tar.gz -C /usr/src/
  tar -vjxf gcc-4.5.2.tar.bz2 -C /usr/src/
2、到自己的home目录下编译依赖库
   view plaincopy
  cd ~
  mkdir gmp-build
  cd gmp-build
  /usr/src/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 #指定安装位置
  make
  make check
  make install
  
  cd ~
  mkdir mpfr-build
  cd mpfr-build
  /usr/src/mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
  make
  make check
  make install
  
  
  cd ~
  mkdir mpc-build
  cd mpfr-build
  /usr/src/mpc-0.8.1/configure --prefix=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
  make
  make check
  make install
3、编译GCC
   view plaincopy
  cd ~
  mkdir gcc-build
  cd gcc-build
  /usr/src/gcc-4.5.2/configure --prefix=/usr/local/gcc-4.5.2 --with-mpc=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2 --enable-languages=c,c++
  make
  make install

怎样调试GCC源码

一、Linux程序gcc编译步骤:
Gcc编译过程主要的4个阶段:
l 预处理阶段,完成宏定义和include文件展开等工作;(.i)
l 根据编译参数进行不同程度的优化,编译成汇编代码(.s.S)
l 用汇编器把汇编代码进一步生成目标代码(.o)
l 用连接器把生成的目标代码和系统或用户提供的库连接起来,生成可执行文件
格式:
l gcc -E test.c//预处理阶段
l Gcc -S test.c//编译阶段
l Gcc -c test.c//汇编阶段
l Gcc -o test test.c//链接阶段
二、Linux程序gdb调试步骤:
Gdb的功能:
l 设置断点
l 监视程序变量的值
l 程序的单步执行
l 显示、修改变量的值
l 显示、修改寄存器
l 查看程序的堆栈情况
l 远程调试
Gdb调试过程:
1、程序经过预处理后,即进入编译阶段,进入编译阶段,首先声明编译:
2、格式:gdb -o test test.c -g
3、进入编译:gdb test
4、显示需要编译调试的源程序:l(list)//list filename
5、设置断点:b(break)行号
6、查看设置的断点:info b
7、运行调试程序:run
8、跳到下一个断点:c(continue)
9、单步运行的话使用:n(next)/s(step into)跳到函数体 //区别在与:next执行函数体,而step不执行函数体
10、调试过程中查看某个变量的变化:print i (每次都要手动设置)//display i(设置一次一直尾随,直到用“undisplay 变量标号” 停止)
11、退出当前的调试使用finish 跳出函数
12、清楚断点 clear 行号
13、Delete 断点信息序号// 删除所有断点或设置的要删除的断点
14、退出调试 q
15、b num if i==20 设置断点的触发条件
16、condition num i==50 改变断点的触发条件

linux的gcc命令linux的gcc

linuxgcc编译好C文件后生成.o目标文件,但是在执行中($./test)出现没有那个文件或目录,请大神帮忙?

.o文件是不能被执行的,c的源码要经过编译和链接才能生成可执行文件,你只是编译了,没有链接,这个文件相当于Windows下的test.obj而已。gcc-Walltest.c-otest

Linux的gcc是怎么用的?

在终端中输入gcc文件名-o目标文件名然后./目标文件名就行了,没有目标文件名,自动存为a执行./a就行了。在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。GCC最基本的用法是∶gcc其中options就是编译器所需要的参数,filenames给出相关的文件名称。-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-ooutput_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶A)#includemyinc.h》B)#include“myinc.h”其中,A类使用尖括号(》),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。GCC执行过程示例示例代码a.c:#includestdio.h》intmain(){printf("hellon");}预编译过程:这个过程处理宏定义和include,并做语法检查。可以看到预编译后,代码从5行扩展到了910行。gcc-Ea.c-oa.icata.c|wc-l5cata.i|wc-l910编译过程:这个阶段,生成汇编代码。gcc-Sa.i-oa.scata.s|wc-l59汇编过程:这个阶段,生成目标代码。此过程生成ELF格式的目标代码。gcc-ca.s-oa.ofilea.oa.o:ELF64-bitLSBrelocatable,AMDx86-64,version1(SYSV),notstripped链接过程:链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。gcca.o-oa程序运行:./ahello本段GCC编译简单例子编写如下代码:#includestdio.h》intmain(){printf("hello,world!n");}执行情况如下:gcc-Ehello.c-ohello.igcc-Shello.i-ohello.sgcc-chello.s-ohello.ogcchello.c-ohello./hellohello,world!

Linux下gcc编译提示错误。在函数_start中main未定义的引用?

你是不是在编译静态库或者动态库?也就是没有main函数。

如果是,再参考一下下边的提示。-c参数表示将源文件编译成object(目标文件)。即gcc-cfoo.c会编译成foo.ogcc不加参数时会编译且尝试链接成可执行文件,然而foo.c的代码中没有main函数的定义,所以最终无法成功链接,故报错。

在linux中,怎么用gcc编译文件?

编译方法:格式gcc常用的选项最简单的是:gcchello.c默认的情况下将生成a.out的可执行性文件,只需要在终端上输入./a.out就可以看到执行的结果,如果你想指定生成目标文件的名字那么你可以加上-o选项,命令如下:gcc-ohellohello.c命令:gcc-chellohello.c

扩展资料:

gcc命令的基本用法gcc其中,filenames为文件名;options为编译选项。当不使用任何编译选项编译hello.c时,gcc将会自动编译产生一个a.out的可执行文件:#lshello.c#gcchello.c#lsa.outhello.c执行:#./a.outHello,World!使用-o编译选择,可以为编译后的文件指定一个名字:#lsa.outhello.c#gcchello.c-ohello#lsa.outhellohello.c执行:#./helloHello,World!注意:使用-o选项时,-o后面必须跟一个文件名,即:-ooutfile。为了便于描述后面的选项,删除hello和a.out可执行文件。

arm-linux-gcc-3.4.5-glibc-2.3.6是什么意思?

是一个交叉编译软件。为什么必须要安装呢?

因为我们编写C语言是在我们自己的PC上linux操作系统下利用GCC编写的,而我们的应用程序最终是要装载到ARM芯片上,所以这中间需要转换。就用的arm-linux-gcc来编译生成目标文件。

如果只是用gcc虽然在个人PC编译正确,但是下载到目标芯片却是错误的,原因就在运行的环境不一样。

你好,软件的源代码可以看到吗比如说gcc编译器,我想改进它必须要知道她的源代码吗,然后修改是吗

编译之后的软件,是不能看到源码的。
有反编译类的软件,但效果很一般,达不到反编译源码再修改后编译的程度。
修改gcc编译器之类的软件,是个很复杂的工作,在没有源码的情况下修改,几乎不可完成。
另外有些软件,支持二次开发接口的,可以做允许范围之内的调整,但核心部分没有哪个软件可以。

gcc源代码行和指令地址的对应关系

GCC 是一种编译器,它可以将源代码转换为机器代码,以便在计算机上运行。在这个过程中,源代码中的每一行都会被转换为一条指令,并且每条指令都会分配一个指令地址。
因此,源代码行和指令地址之间存在一种对应关系,即每一行源代码都对应一个指令地址,而每个指令地址又对应着一行源代码。这种对应关系可以通过调试器来查看,或者通过编译器产生的中间代码和目标代码来跟踪。
然而,需要注意的是,源代码行和指令地址之间的对应关系并不一定是一对一的,因为一行源代码可能会被编译器转换为多条指令,而多条指令可能会被映射到同一个指令地址上。因此,在研究这种对应关系时,需要格外小心,以免产生误解。

编译环境cmake+gcc怎么编译mysql源码

方法/步骤
1
在安装mysql数据库服务器前,确保你的linux系统是可以连接网络的,下面我们将通过源码方式来安装mysql首先通过putty登入进你的Linux系统,确保系统中已经安装的gcc c++ 等编译环境,因为mysql从5.5版本开始是使用cmake编译的,如果三个环境都没安装,可以使用下面的命令进行安装:yum -y install make gcc-c++ cmake bison-devel ncurses-devel
2
查找系统里是否已经安装了mysql数据库的相关组件,使用命令:rpm -qa | grep mysql 进行查找,如果查找到,可以使用下面命令进行强制卸载:rpm -e --nodeps 包名
如果你当时在安装Linux系统时,使用的默认的安装选项,这一步可以跳过;

用TDM-GCC编译Lua源码,如何修改官方Makefile把所有源码编译成一个exe文件,而不生成依赖的dll文件

我使用了windows下的msys做的编译,进入lua源文件的src目录下,把mingw段改成如下:
mingw:
$(MAKE) "LUA_A=lua52.a" "LUA_T=lua.exe" \
"AR=$(AR) -o" "RANLIB=strip --strip-unneeded" \
"SYSCFLAGS=-static" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
$(MAKE) "LUAC_T=luac.exe" luac.exe
然后在上一层调用make mingw就可以了

cmd调用gcc编译c源码,并传参

下面将通过对一个程序的编译来演示整个过程。
1
2
3
4
5
6
7

#include 《stdio.h》

int main()
{
printf("happy new year!\n");
return 0;
}
  
1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了
一条低级机器语言指令。

关于本次gcc编译器源码和透过源码领悟GCC到底在干些什么 GCC源码分析的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

gcc编译器源码(透过源码领悟GCC到底在干些什么 GCC源码分析)

本文编辑:admin

更多文章:


microsoftword产品密钥(office2016专业增强版密钥)

microsoftword产品密钥(office2016专业增强版密钥)

各位老铁们好,相信很多人对microsoftword产品密钥都不是特别的了解,因此呢,今天就来为大家分享下关于microsoftword产品密钥以及office2016专业增强版密钥的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起

2026年10月11日 22:20

gcc编译器源码(透过源码领悟GCC到底在干些什么 GCC源码分析)

gcc编译器源码(透过源码领悟GCC到底在干些什么 GCC源码分析)

本篇文章给大家谈谈gcc编译器源码,以及透过源码领悟GCC到底在干些什么 GCC源码分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月11日 22:00

固态硬盘分区用什么格式好(买的新的固态硬盘分区选择NTFS和FAT32哪种好些)

固态硬盘分区用什么格式好(买的新的固态硬盘分区选择NTFS和FAT32哪种好些)

各位老铁们,大家好,今天由我来为大家分享固态硬盘分区用什么格式好,以及买的新的固态硬盘分区选择NTFS和FAT32哪种好些的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下

2026年10月11日 20:50

不能安装360(为什么电脑不能下360浏览器)

不能安装360(为什么电脑不能下360浏览器)

其实不能安装360的问题并不复杂,但是又很多的朋友都不太了解为什么电脑不能下360浏览器,因此呢,今天小编就来为大家分享不能安装360的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 20:20

桌面主题尽在下载(怎么在win10系统电脑中的应用商店中下载新的桌面主题)

桌面主题尽在下载(怎么在win10系统电脑中的应用商店中下载新的桌面主题)

“桌面主题尽在下载”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看桌面主题尽在下载(怎么在win10系统电脑中的应用商店中下载新的桌面主题)!

2026年10月11日 20:10

iphone7home键按压没反应(iPhone7/Plus Home键失灵怎么办)

iphone7home键按压没反应(iPhone7/Plus Home键失灵怎么办)

其实iphone7home键按压没反应的问题并不复杂,但是又很多的朋友都不太了解iPhone7/Plus Home键失灵怎么办,因此呢,今天小编就来为大家分享iphone7home键按压没反应的一些知识,希望可以帮助到大家,下面我们一起来看

2026年10月11日 16:40

电信光猫是什么(光猫是什么东西)

电信光猫是什么(光猫是什么东西)

大家好,今天小编来为大家解答以下的问题,关于电信光猫是什么,光猫是什么东西这个很多人还不知道,现在让我们一起来看看吧!

2026年10月11日 16:30

应用并行配置不正确怎么办(XP系统安装软件提示程序并行配置不正确件的故障原因及解决方法)

应用并行配置不正确怎么办(XP系统安装软件提示程序并行配置不正确件的故障原因及解决方法)

各位老铁们,大家好,今天由我来为大家分享应用并行配置不正确怎么办,以及XP系统安装软件提示程序并行配置不正确件的故障原因及解决方法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家

2026年10月11日 15:40

cf调烟雾头最清晰的方法(cf烟雾头怎么调最清楚)

cf调烟雾头最清晰的方法(cf烟雾头怎么调最清楚)

大家好,今天小编来为大家解答以下的问题,关于cf调烟雾头最清晰的方法,cf烟雾头怎么调最清楚这个很多人还不知道,现在让我们一起来看看吧!

2026年10月11日 15:20

男生说的b站是啥(男生对女生说bi li bi li啥意思)

男生说的b站是啥(男生对女生说bi li bi li啥意思)

“男生说的b站是啥”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看男生说的b站是啥(男生对女生说bi li bi li啥意思)!

2026年10月11日 12:30

最近更新

临沂企业网站优化目标如何设定?
2026-10-11 23:25:16 浏览:0
如何写SEO文案提升网站排名
2026-10-11 23:23:19 浏览:0
正规网站建设无锡如何选择
2026-10-11 23:21:18 浏览:0
热门文章

sql server2008下载地址(如何下载SQL Server 2008 R2 SP2免费版)
2026-10-05 05:30:29 浏览:6
thinkpadx100eu盘启动(thinkpad x100e U盘启动 支持的写入方式是什么)
2026-09-01 14:20:01 浏览:6
标签列表