gcc相关信息

一、对gcc的认识
然我们称GCC是C语言编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.i为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
二、其他的编译器
除了gcc, 还有哪些常用的牛逼的编译器(不限制编程语言, 不限制平台). 
EGCS(Experimental/Enhanced GNU Compiler System) 一个编译系统,包括了C/C++/Obj-C/Fortran等编译器
三、为什么调试的时候需要编译选项中的-g

   现代的开发系统都具有强大的调试工具,它们成为程序开发者跟踪程序执行过程、解决程序潜在问题的利器,使用 GCC 开发程序也不例外,与之配套的调试工具便是 gdb ,简称至 GUN Debugger,我们常用它来调试 GCC 编译生成的可执行文件,这里引入 gdb 是为了简单介绍一下 GCC 的 -g 选项。

   默认编译生成的可执行文件是无法使用 gdb 来跟踪或调试的,因为可执行程序中没有可供 gdb 调试使用的特殊信息,为了将必要的调试信息整合到可执行文件中,我们便需要用到 -g 选项,这样生成的可执行程序,倘若出现问题,便可以使用 gdb 找出问题具体出现的位置,便于问题的解决。

下面我们就来制造一个“问题”程序,演示一下 -g 选项的使用,同时也体验一下 gdb 的调试功能

#include <stdio.h>
int main()
{
    int num=365;
    printf(“%s  days a  years\n”,num);
    return 0;
}

仔细观察上面的代码发现了问题出在了printf函数上,int类型的整数应该以%d的形式进行打印,使用%s进行打印的,就变成了打印365的内存区域了,在执行问题程序时出现了段错误,为了记录程序出现具体错误的位置,我们需要对core文件进行相关的配置。

那么什么是core文件呢?其实当shell运行的程序出现错误而奔溃时,系统会自动生成一个文件,用于记录奔溃时刻的系统信息,包括内存和寄存器信息,可供程序开发者日后排查问题时使用,这个文件就是 core 文件。一般而言,core 文件存放在当前目录,不论崩溃的程序编译时是否加了 -g 选项,都可以使用“gdb 程序名 core文件”命令来查看程序崩溃时的相关信息,只是编译时加了 -g 选项的程序崩溃后可以使用 gdb 通过 core 文件跟踪到程序崩溃的具体文件、函数以及行数,而未加 -g 选项的程序崩溃后则只能通过 core 文件跟踪到崩溃的具体函数而已。

进入 Shell 以后,core 文件的大小默认设置为 0,这样程序在崩溃以后系统就不会帮我们记录 core 文件了,为了能够调试,我们使用命令“ulimit -c unlimited”将 core 文件大小设置为 unlimited (无限大),当然也可以使用数字来代替 unlimited,对 core 文件的上限大小做更精确的设定。

四、readelf命令

 功能:用来显示elf格式文件的信息。

 描述:用来显示一个或多个elf格式的目标文件,可以通过它的选项来控制显示那些信息。这里的elf-file(s)就表示那些  被检查的文件。可以支持32位,64位的elf格式文件,也就是包含elf文件 的文档(这里一般指的是ar命令将一些elf文件打  包之后生成的例如lib*.a之类的“静态库文件”)。

   这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目的就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。

运行readelf的时候,除了-v和-H之外,其他的选项必须有一个被指定。

五、Linux下软件安装的几种方式(源码安装, rpm安装, yum安装). 重点要理解rpm安装和yum安装的区别. 

   曾经我们遇到linux上的软件都通过Tarball的方式进行源码安装,但每次都要下载、编译、安装,实在是太麻烦了。今天我要说的是通过yum和rpm安装:

rpm:它最大特点是把软件编译成RPM安装包,该安装包里记录了依赖的软件,当安装RPM安装包时,如果满足以来条件,予以安装,否则将不能安装。RPM虽然方便,但它要求你的主机环境和当初建立这个安装包的主机环境一模一样才行,因此有了SRPM,即Source RPM,也就是说RPM安装包还包含源代码。通常一个软件在发布时,会同时释放出该软还的RPM与SRPM,如果没有适合我们操作系统和硬件的RPM,我们还可以通过修改SRPM内的参数设置文件,然后重新编译 适合我们linux环境的RPM文件。

yum:在线安装升级在于RPM安装软件时,会出现一些比较恶心的情况,就是你要安装的软件依赖于另一个软件,而该软件又依赖于其他软件,以此类推,这样一层一层下去,会很麻烦。YUM就是用来解决一个问题的,它会一口气把所有的软件一并安装,并且是在线的。

tar.gz源代码包安装方式: 

1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录; 

2、打开一个终端,su -成root用户; 

3、cd soft.tar.gz所在的目录; 

4、tar -xzvf soft.tar.gz //一般会生成一个soft目录 

5、cd soft 

6、./configure 

7、make 

8、make install

详细介绍:

1. 安装:
  整个安装过程可以分为以下几步:
  1) 取得应用软件:通过下载、购买光盘的方法获得;
  2)解压缩文件:一般tar包,都会再做一次压缩,如gzip、bz2等,所以你需要先解压。如果是最常见的gz格式,则可以执行:“tar –xvzf 软件包名”,就可以一步完成解压与解包工作。如果不是,则先用解压软件,再执行“tar –xvf 解压后的tar包”进行解包;
  3) 阅读附带的INSTALL文件、README文件;
  4) 执行“./configure”命令为编译做好准备;
  5) 执行“make命令进行软件编译;
  6) 执行make install完成安装;
  7) 执行“make clean”删除安装时产生的临时文件。
好了,到此大功告成。我们就可以运行应用程序了。但这时,有的读者就会问,我怎么执行呢?这也是一个Linux特色的问题。其实,一般来说, Linux的应用软件的可执行文件会存放在/usr/local/bin目录下!不过这并不是“放四海皆准”的真理,最可靠的还是看这个软件的 INSTALL和README文件,一般都会有说明。
2. 卸载:
通常软件的开发者很少考虑到如何卸载自己的软件,而tar又仅是完成打包的工作,所以并没有提供良好的卸载方法。

那么是不是说就不能够卸载呢!其实也不是,有两个软件能够解决这个问题,那就是Kinstall和Kife,它们是tar包安装、卸载的黄金搭档。

rpm包安装方式步骤: 

 1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录; 

 2、打开一个终端,su -成root用户; 

 3、cd soft.version.rpm所在的目录; 

 4、输入rpm -ivh soft.version.rpm

详细介绍:

   1. 安装:
   我只需简单的一句话,就可以说完。执行:
   rpm –ivh rpm的软件包名
     更高级的,请见下表:
   rpm参数 参数说明
   -i 安装软件
   -t 测试安装,不是真的安装
   -p 显示安装进度
   -f 忽略任何错误
   -U 升级安装
   -v 检测套件是否正确安装
   这些参数可以同时采用。更多的内容可以参考RPM的命令帮助。
2. 卸载:
   我同样只需简单的一句话,就可以说完。执行:rpm –e 软件名
不过要注意的是,后面使用的是软件名,而不是软件包名。例如,要安装software-1.2.3-1.i386.rpm这个包时,应执行:rpm –ivh software-1.2.3-1.i386.rpm,而当卸载时,则应执行:rpm –e software。另外,在Linux中还提供了象GnoRPM、kpackage等图形化的RPM工具,使得整个过程会更加简单。

yum安装

安装前可以先用 yum list package 查看是否已安装,如果未安装可以使用 yum search package 搜索yum仓库中有关这个软件的信息

1.yum install package  #安装指定的安装包package,如果有依赖软件会一并安装
2.yum源升级
yum update  #全部更新
yum update package  #更新指定程序包package
3.卸载
yum -y remove package  #删除程序包package,如果有依赖软件会一并删除

以上就是我做的一些总结,精彩请见后续。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值