编译器能翻译静态库吗(透过源码领悟GCC到底在干些什么 GCC源码分析)

2026-09-18 20:15:01 0

编译器能翻译静态库吗(透过源码领悟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

编写好一个程序后怎样测试谢谢

为了使计算机程序得以运行,计算机需要加载代码,同时也要加载数据,然后由处理器执行指令。整个过程可以总结为编译、链接、装载、执行。
1、编译
编译过程又可以被分为两个阶段:编译、汇编。
编译是指编译器读取字符流的源程序,对其进行词法与语法的分析,将高级语言指令转换为功能等效的汇编代码。
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
2、链接
链接的主要内容是将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。链接又分为静态链接和动态链接:
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大;
动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
3、装载
程序在经过链接后,得到了可执行文件,下一步就需要将可执行程序加载到内存中。
由于现代操作系统均采用分页的方式来管理内存,所以操作系统只需要读取可执行文件的文件头,之后建立起可执行文件到虚拟内存的映射关系,而不需要真正的将程序载入内存。
4、运行
加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。
在程序的运行过程中,CPU发现有些内存页在物理内存中并不存在并因此触发缺页异常,此时CPU将控制权限转交给操作系统的异常处理函数,操作系统负责将此内存页的数据从磁盘上读取到物理内存中。

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

编译器能翻译静态库吗(透过源码领悟GCC到底在干些什么 GCC源码分析)

本文编辑:admin

更多文章:


index反义词(某些词语的反义词一问!急)

index反义词(某些词语的反义词一问!急)

“index反义词”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看index反义词(某些词语的反义词一问!急)!本文目录某些词语的反义词一问!急英语单词相应形式“凉爽”的反义词是什么指数   [zhǐ shù]什么意思近义词

2025年12月25日 19:30

linux就该这么学app(linux中@是什么意思)

linux就该这么学app(linux中@是什么意思)

本篇文章给大家谈谈linux就该这么学app,以及linux中@是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录linux中@是什么意思小白学习前端的路线大概是怎样的安装linux过程中,显示器提示 超频linux中

2026年8月31日 14:15

set layer翻译(layer的意思)

set layer翻译(layer的意思)

大家好,set layer翻译相信很多的网友都不是很明白,包括layer的意思也是一样,不过没有关系,接下来就来为大家分享关于set layer翻译和layer的意思的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目

2025年8月26日 04:00

clips4sale(Clips是什么软件)

clips4sale(Clips是什么软件)

本篇文章给大家谈谈clips4sale,以及Clips是什么软件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录Clips是什么软件clips怎么读clips4sale怎么注册clips4sale上片子怎么买,具体点的说..一

2025年7月25日 12:00

android官网上的sdk页面为什么打不开?sdkdns官网去哪里了

android官网上的sdk页面为什么打不开?sdkdns官网去哪里了

大家好,今天小编来为大家解答以下的问题,关于sdk官网,android官网上的sdk页面为什么打不开这个很多人还不知道,现在让我们一起来看看吧!本文目录android官网上的sdk页面为什么打不开sdkdns官网去哪里了android官网上

2025年7月1日 06:45

tongesilea(冰河时代中文版歌词)

tongesilea(冰河时代中文版歌词)

大家好,关于tongesilea很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于冰河时代中文版歌词的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录冰河时

2026年1月15日 01:00

用html设计一个漂亮的网页(如何将html页面设计得漂亮点,特别是字体的样式,有没有办法弄些比较炫的,或者在哪里可以找到漂亮的字体)

用html设计一个漂亮的网页(如何将html页面设计得漂亮点,特别是字体的样式,有没有办法弄些比较炫的,或者在哪里可以找到漂亮的字体)

各位老铁们,大家好,今天由我来为大家分享用html设计一个漂亮的网页,以及如何将html页面设计得漂亮点,特别是字体的样式,有没有办法弄些比较炫的,或者在哪里可以找到漂亮的字体的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注

2025年5月28日 18:30

推荐几个权威的手机论坛大神们帮帮忙?手机版天涯社区怎么发帖啊

推荐几个权威的手机论坛大神们帮帮忙?手机版天涯社区怎么发帖啊

这篇文章给大家聊聊关于手机版论坛,以及推荐几个权威的手机论坛大神们帮帮忙对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录推荐几个权威的手机论坛大神们帮帮忙手机版天涯社区怎么发帖啊手机版晋江的论坛为什么删除不了不再看ta机锋论坛

2026年9月1日 04:00

ios是什么?怎么看苹果的ios是几啊

ios是什么?怎么看苹果的ios是几啊

这篇文章给大家聊聊关于苹果ios,以及ios是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录ios是什么怎么看苹果的ios是几啊ios是什么手机的型号苹果7怎么更新ios16苹果确认iOS16存漏洞影响新机激活,这会影响

2025年7月9日 07:00

xml文件丢失(bitcomet.xml文件消失了怎么办)

xml文件丢失(bitcomet.xml文件消失了怎么办)

本篇文章给大家谈谈xml文件丢失,以及bitcomet.xml文件消失了怎么办对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录bitcome

2026年4月4日 03:00

android网格布局图片(UI和安卓的布局分别是什么)

android网格布局图片(UI和安卓的布局分别是什么)

各位老铁们好,相信很多人对android网格布局图片都不是特别的了解,因此呢,今天就来为大家分享下关于android网格布局图片以及UI和安卓的布局分别是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录UI和

2026年5月8日 12:45

ubuntu安装hadoop教程(在Ubuntu里面搭建四个节点内存怎么分配)

ubuntu安装hadoop教程(在Ubuntu里面搭建四个节点内存怎么分配)

其实ubuntu安装hadoop教程的问题并不复杂,但是又很多的朋友都不太了解在Ubuntu里面搭建四个节点内存怎么分配,因此呢,今天小编就来为大家分享ubuntu安装hadoop教程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问

2025年7月12日 14:30

蜘蛛统计与分析(蜘蛛的种类及习性)

蜘蛛统计与分析(蜘蛛的种类及习性)

大家好,关于蜘蛛统计与分析很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于蜘蛛的种类及习性的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录蜘蛛的种类及习

2026年7月24日 10:00

简单登录界面代码(登录界面代码怎么写)

简单登录界面代码(登录界面代码怎么写)

大家好,关于简单登录界面代码很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于登录界面代码怎么写的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录登录界面代

2026年7月17日 07:30

学什么语言好(想学一门外语,学什么语种比较好)

学什么语言好(想学一门外语,学什么语种比较好)

大家好,今天小编来为大家解答以下的问题,关于学什么语言好,想学一门外语,学什么语种比较好这个很多人还不知道,现在让我们一起来看看吧!本文目录想学一门外语,学什么语种比较好学习什么语言最好就业学什么语言最好什么语言最好学现在学习什么语言最好就

2026年2月1日 19:15

nginx配置ip访问网站(如何在CloudFlare下Nginx实现访客真实IP网站日志)

nginx配置ip访问网站(如何在CloudFlare下Nginx实现访客真实IP网站日志)

本篇文章给大家谈谈nginx配置ip访问网站,以及如何在CloudFlare下Nginx实现访客真实IP网站日志对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2026年4月23日 09:30

div音乐术语(div音乐术语是什么意思)

div音乐术语(div音乐术语是什么意思)

这篇文章给大家聊聊关于div音乐术语,以及div音乐术语是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录div音乐术语是什么意思合唱团中的div.是什么意思乐谱中的opt.div.是什么意思音乐术语“con sord

2026年5月3日 07:30

teammates的中文(八年级英语翻译中文)

teammates的中文(八年级英语翻译中文)

今天给各位分享八年级英语翻译中文的知识,其中也会对八年级英语翻译中文进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录八年级英语翻译中文帮忙翻译下面的中文.急用英语翻成中文 高分送上30句经典英语台词,有中文翻译

2026年8月30日 20:30

生活中常见的嵌入式产品(问:谈谈你在生活中用到了那些嵌入式的产品并简单说明原理 要写路由器的嵌入式原理,)

生活中常见的嵌入式产品(问:谈谈你在生活中用到了那些嵌入式的产品并简单说明原理 要写路由器的嵌入式原理,)

各位老铁们,大家好,今天由我来为大家分享生活中常见的嵌入式产品,以及问:谈谈你在生活中用到了那些嵌入式的产品并简单说明原理 要写路由器的嵌入式原理,的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最

2026年8月17日 23:15

table tennis读音(tabletennis怎么读)

table tennis读音(tabletennis怎么读)

大家好,关于table tennis读音很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于tabletennis怎么读的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮

2025年12月5日 00:30

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索