Linux学习系列之Linux入门(三)gcc学习
GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。详见百度百科、维基百科、gcc官网。
一、GCC的编译过程
二、GCC的常用操作
三、官方参考手册的阅读
四、主要参考资料
GCC的编译过程主要分为四个阶段,预处理(Pre-Processing,cpp工具)、编译(Compiling,ccl工具)、汇编(Assembling,as工具)、链接(Linking,ld工具)。每一步执行,其指令为:gcc [选项] 要编译的文件 [选项] [目标文件],现以hello.c程序为例为逐一介绍。
#include<stdio.h> int main(void)
{
printf("Hello World!\n");
return ;
}
1 预处理:
gcc –E hello.c –o hello.i
2 编译:
gcc –S hello.i –o hello.s
3 汇编:
gcc –c hello.s –o hello.o
4 连接:
gcc hello.o –o hello
5 以上各步,我们可以通过vim查看各生成文件(-o后面的文件)的内容,其实:
hello.c : 最初的源代码文件;
hello.i : 经过编译预处理的源代码,该步主要完成宏(#开头的代码)替换,其中选项-E控制命令的停止;
hello.s : 汇编处理后的汇编代码,该步主要完成将上一步的生成的文件,转换成汇编代码,其中选项-S控制命令的停止;
hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。
hello : 最终的可执行文件,该步主要完成对目标文件的链接工作。
二、GCC的常用操作
(一)编译命令
1 gcc -Wall file.c -o file
该命令表示在将源文件file.c编译成可执行文件file,其中-Wall表示开户警告检查功能,-o(object)代表后面是目标文件;
2 gcc -Wall file.c /xx/xx/libName.a -o file
该命令与上面的区别在于,该源文件中使用到系统库文件(功能文件,如线程或数学函数等)或函数(一般位于/usr/lib和/usr/local/lib下),故需要显式的指明其地址;
3 gcc -Wall file.c -lName -o file
该命令作用同上式,差别在于,它使用选项的形式,指出系统的库,注意:libName.a和-lName间的对应关系
4 gcc -Wall -I/xx/include -L/xx/lib file.c -o file
该命令的作用同上式,差别在于,该源文件使用到了系统库中没有的头文件和库文件,故需要显式的指出其位置;
注:编译器一般的搜索路径为:由-I\-L指定的路径->由环境变量指定的路径(C_INCLUDE_PATH LIBRARY_PATH LD_LIBRARY_PATH)->默认的系统目录
5 gcc -Wall -g file.c -o file
该命令的作用同1,差别在于,其开启了调试功能;
(二)工具应用
1 查看文件的属性(如某一可执行文件是由动态库生成的还是静态库生成的)
file filename
2 查看文件的符号表(如检查某个库是否包含的特定函数的定义)
nm filename
3 查看文件的动态库属性(如检查可执行文件并显示它需要的共享库的列表)
ldd filename
4 使用性能剖析器(gprof)
5 代码覆盖测试(gcov)
6 归档工具(ar,创建静态库)
1 准备Name.h文件和filenameN.c文件;
2 将.c文件编译成对应的.o文件(gcc -c filenameN.c [-o filenameN.o])
3 ar cr libName.a filename1.o filename2.o ... filenameN.o(cr表示Create and replace,libName为静态库的名字);
4 ar t libName.a (可以查看该静态库中包含的“对象文件”);
7 动态库创建
动态库的创建主要有三种方法:ld相对来说比较复杂,而gcc -share相对简单,但是-share并非在任何平台都可以使用,而GNU提供了一个更好的工具libtool,专门用来在各种平台上生成各种库。在此,我们简单介绍一下gcc制作动态库的过程:
1 准备Name.h文件和filenameN.c文件;
2 将.c文件编译成对应的.o文件(gcc -c filenameN.c [-o filenameN.o])
3 gcc -shared -fPIC -o libName.so filename1.o filename2.o ... filenameN.o()
注:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真 正代码段共享的目的。
8 Segmentation fault (core dumped)的分析解决
该错误(崩溃)表示程序试图访问不在分配给它的内存区域之列的受限制的内存“段”(segmentation)。而一般只要显示了报错信息“core dumped”,操作系统就在当前目录下生成了一个名为“core”的文件。该core文件包含程序在被终结时用到的内存页面的完整备份。如果没有该core文件,那么我们通过输入ulimit -c unlimited命令,并再试编译(带上-g选项),就会得到这个文件。那么怎样进行查看该错误的出处呢?
gdb a.out core最后一行(gdb)是 GNU 调试器的提示符----它表示现在新的命令可以被输入了。
要调查程序崩溃的原因,我们用调试器的 print 命令来显示指针 p 的值:
三、官方参考手册的阅读
四、主要参考资料
Linux学习系列之Linux入门(三)gcc学习的更多相关文章
- 免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践
免考final linux提权与渗透入门--Exploit-Exercise Nebula学习与实践 0x0 前言 Exploit-Exercise是一系列学习linux下渗透的虚拟环境,官网是htt ...
- Linux Shell系列教程之(三)Shell变量
本文是Linux Shell系列教程的第(三)篇,更多shell教程请看:Linux Shell系列教程 Shell作为一种高级的脚本类语言,也是支持自定义变量的.今天就为大家介绍下Shell中的变量 ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- Redis学习系列一Linux环境搭建
1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- 《Linux内核分析》课程第三周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux学习系列之Linux入门(二)Vim学习
第二篇 Vim学习 主要内容: 基本命令: 插件扩展: 参考资料: vim是一个命令控制的文本编辑器,可以完成几乎我们想要做的所有工作,除了Emacs几乎没有其他的工具能和它匹敌.官方网站是:http ...
- Linux学习系列之Linux入门(一)linux安装与入门
第一篇:安装并配置Linux开发环境 一.安装linux: 主要安装Linux的发行版,到目前为之,主要的发行版有: 比较常用的是Ubuntu.redhat和centOS,主要的安装方法详细: Ubu ...
- linux学习系列--初识Linux系统
### 认识Linux- Linux是一种类UNIX的系统,Unix是1965年在贝尔实验室开发的一个项目,用来开发操作系统- Linux之父-Linus Torvalds在1991年10月5日,他在 ...
随机推荐
- 本地计算机上的XXX服务启动后停止。某些服务在未由其它服务或程序使用时将自动停止。咋整?
用C#写个windows服务,安装部署后去启动时,提示说“本地计算机上的XXX服务启动后停止.某些服务在未由其它服务或程序使用时将自动停止”.咋整?就像下面酱紫: 度娘说不知道咋整,我想把程序附加到w ...
- Advanced Installer
Advanced Installer是一款功能强大.可生成符合 MS Windows 认证的 Windows Installer 的 MSI 安装包制作工具,具有友好的图形用户界面,直观而且非常简单的 ...
- hishop网站迁移后出现DataProtectionConfigurationProvider错误(转)
配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件.分析器错误信息: 未能使用提供程序“DataProtectionConfiguration ...
- iOS 视频开发-AVPlayer
如果我只是简单的播放一个视频,而不需要考虑播放器的界面.iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewCo ...
- Ehcache(2.9.x) - API Developer Guide, Cache Usage Patterns
There are several common access patterns when using a cache. Ehcache supports the following patterns ...
- unity3d首次倒入工程文件出错Opening file Library/FailedAssetImports.txt failed解决方法
打开unity3d,首次倒入工程到unity编辑器,但是频繁弹出“Opening file Library/FailedAssetImports.txt failed”的错误对话框,很麻烦. 解决方法 ...
- 注意java的对象引用
要注意,当前拿到的“对象引用”, 是不是 指向 最新的实例, 没有的话, 要重新 生成实例去指向. 代码例子: AnsweringRuleInfo bhRule = accountGenerator. ...
- Objective-c中的对象间的消息传递以及消息路由
刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...
- Objective-C 【点语法】
------------------------------------------- 点语法的使用 // // 点语法的使用 // // 点语法: xcode的一种特性,xcode帮我们做代 ...
- 20分钟入门Redux
Redux就是个数据中心,不依附于任何框架在哪使用都行.但是和它最搭配的应该就是React了,而且大家学习它的动力大多也是解决React状态管理的问题.都说Redux文档详尽清晰,但我感觉并不友好,它 ...