目录
- 什么是GCC?
- GCC能做什么?
- gcc/g++和Binutils基本指令
-
- gcc/g++
-
- 生成预处理文件
- 生成汇编文件
- 生成目标文件
- 构建可执行文件
- 生成动态库
- Binutils
-
- ar文档管理工具
-
- 生成静态库
- nm库符号表读取工具
-
- 查看符号表
- readelf,ranlib等待补充
- gcc编译器的常用参数
什么是GCC?
GCC全称为GNU Compiler Collection,即GNU编译工具集。GNU指的是GNU(革奴)计划,是由理查德斯托曼带头开发的自由软件创作计划,原目标是构建一款自由开放的操作系统(Hurd内核+GNU配套系统软件),GCC就是属于计划中配套系统软件这部分。这段开源历史大家可以自行了解,很有趣
GCC编译工具集可以处理的语言不局限于C/C++,还包括C/C++的各种方言标准,Go,Fortan等其他语言,工具集中主要有:
- 核心编译器:gcc/g++
- 二进制工具集Binutils:汇编器as,链接器ld,库封包工具ar,目标格式查看器readelf等
- C/C++语言的标准库:glibc,libstdc++等
除了功能强大以外,GCC还具有很高的可移植性,在不同架构的很多操作系统上都可以使用,包括GNU系操作系统,Linux, Windows,MacOS,BSD等
GCC能做什么?
通过GCC工具集最主要的功能就是将C/C++的源码编译成对应平台可执行文件或者库;里面的部分工具还可以协助逆向,分析可执行文件
可执行文件构建的一般流程为:
- 源文件 – 》预处理 – 》编译 – 》 汇编 -》 链接 – 》 可执行文件
库的构建的一般流程为:
- 源文件 – 》预处理 – 》编译 – 》 汇编 -》打包-》库
编译还分为两种情况:
- 当编译平台和执行平台一致时,称为本地编译,例如你在PC上进行编译,最终生成的程序也会在PC上执行;
- 当编译平台和执行平台不一致时,称为交叉编译,例如你在PC上使用Keil开发51单片机程序并编译成固件,最终在单片机上执行;经常接触嵌入式的开发者,对交叉编译很熟悉
gcc/g++和Binutils基本指令
gcc/g++
GCC编译工具集中的gcc编译器,一般来说可以完成大部分工作,包括预处理,编译,汇编,链接
生成预处理文件
gcc -E 源文件.c -o 源文件.i
生成预处理文件指令仅会在屏幕输出源文件预处理后的内容,不会生成文件,可以通过重定向标准输出得到对应预处理.i文件。预处理操作主要包括宏替换展开,头文件包含,条件编译等
生成汇编文件
gcc -S 源文件.c
生成汇编文件指令可以通过源文件生成对应汇编文件,后缀名为.s。汇编操作主要就是将源文件的C/C语言转换成了汇编语言
生成目标文件
gcc -c 源文件.c
生成目标文件指令可以通过源文件生成对应中间目标文件,后缀名为.o。目标指令的操作主要就是将源文件转换成中间目标文件,文件内容已经属于机器语言,人类不可读
构建可执行文件
gcc -o 源文件.c
构建可执行文件指令可以通过源文件生成可执行文件,文件名一般为a.out(Windows平台为a.exe)。可执行文件可以直接执行,完成开发者设定的任务
生成动态库
gcc -shared -fPIC -o 动态库名.so 源文件.c
生成动态库指令可以将源文件打包生成动态库,后缀名为.so(Windows平台为.dll)。在Windows平台中动态库还有对应导入库的概念,相对Linux更复杂。
Binutils
ar文档管理工具
ar文档管理工具常用方法是打包中间目标文件生成静态库,当然它也可以修改库,从库中提取模块
生成静态库
ar rcs 静态库名.a 中间目标文件.o
生成静态库指令可以将中间目标文件打包生成静态库,后缀名为.a(Windows平台为.lib)。
r参数的意义为在库中插入模块,当向库中插入存在对应模块时会产生替换,插入新模块时,会插入到库的末尾
c参数的意义为创建库,无论库是否存在
s参数的意义为创建目标索引,当库文件较大,内容较多时,索引可以加快编译速度,如果不加s参数,后续可以通过ranlib工具或者ar s命令加入
nm库符号表读取工具
NM库符号表读取工具用于读取静态库或动态库中的符号表信息,包括值,类型,名称
查看符号表
nm 动态库.so/静态库.a
查看符号表指令可以输出对应动态库/静态库中的对应接口符号表信息,一般用于确认库内部数据
readelf,ranlib等待补充
gcc编译器的常用参数
GCC编译器编译可执行程序时,可以加入可选参数,用于加入自定义头文件/库,查看编译信息,优化编译流程,加入调试信息等等
参数 | 意义 |
---|---|
-O0 、-O1 、-O2 、-O3 | 用于编译优化,可选四个参数,-O0为没有优化,-O1为默认值,-O3优化级别最高 |
-Idir | 用于指定头文件搜索路径,dir为文件夹名称。如-Imod |
-Ldir | 用于指定库文件搜索路径,dir为文件夹名称 。如-Llib |
-llibname | 用于来链接指定库文件,libname为库名称;同名动态库静态库都存在时,优先链接动态库;注意所链接的静态/动态库文件名必须为lib+xxx.a或so的格式,libname为xxx。如libtest.a库对应链接指令为-ltest |
-w | 不生成任何警告信息 |
-Wall | 显示所有警告信息 |
-static | 强制使用静态库链接 |
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/1490454.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
GCC简介,基础命令以及常用参数【新手向】
目录什么是GCC?GCC能做什么?gcc/g和Binutils基本指令gcc/g生成预处理文件生成汇编文件生成目标文件构建可执行文件生成动态库Binutilsar文档管理工具生成静态库nm库符号表读取工具查看符号表readelf,ranlib等待补充gcc编译器的常用参数什么是……
Apache druid未授权命令执行漏洞复现
简介
Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查询分析("OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图……
PostgreSQL日期和时间操作大全
1. 官网帮忙文档 日期时间函数网址
1.2 函数使用方法
PatternDescriptionRemarkHHhour of day (01–12)HH12hour of day (01–12)HH24hour of day (00–23)MIminute (00–59)SSsecond (00–59)MSmillisecond (000–999)USmicrosecond (000000–999999)FF1tenth of second (0–……
控制小数点精度
第一 头文件 iomanip cout<<fixed<<setprecision(n)<<a; 第二 printf 头文件 cstdio 格式 printf("%.mf",a)…
控制输出长度
printf ("%nd",a);setw(n) cout<<setw(n)<<a; (注意前两种在左端补空格)
以下操作补0 3. printf("%0nd",a); 4. cout<<setw(n)<<setfill(“0”)<<a;…
简单的不同类型的除法
在这里插入代#include
using namespace std;
int main() { double a,b,c;//定义的数据类型都是double类型的,所以得到的商也是double类型的 cin>>b>>c; ab/c; cout<<a; return 0; } 码#include
using namespace std;
int main() { double a……
求最大公约数大函数体
#include
using namespace std; int gcd(int m,int n) { if(m%n0) { return n; } else { return (gcd(n,m%n));//辗转相除法求最大公约数,递推构建函数 } }
int main() { int a,b; cin>>a>>b; cout<<gcd(a,b); }…
python控制数字位数
1.取整 int() 直接保留整数位round() 四舍五入取整math.ceil() 向上取整
2.控制小数位数
round(a,n) a保留n位小数后返回
3.分离整数和小数位
math.modf() 返回值是一个元组,第一个值是小数部分,第二个值是整数部分,注意整数部分含有&……
字符串的join和split方法
join:拼接字符串
split:分割字符串
x"1.2.3.4.5"
sx.split(".")#用”."分割x后返回一个列表
print(s)
m"".join(str(x) for x in s)#返回一个用加号拼接的字符串
print(m)
输出
[1, 2, 3, 4, 5]
12345…
python数据类型——列表
1.列表介绍 列表作为序列(sequence)的一种,是一组有顺序的元素的集合。
列表是python中最常用的内置数据类型,用中括号[元素1,元素2…]括起,以逗号分隔,元素之间没有任何关系,可以是任何类型。
数组是只能存储同一种……
反序列化渗透与攻防(五)之shiro反序列化漏洞
Shiro反序列化漏洞
Shiro介绍
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默……
vue2+vue3
vue2vue3尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解: 不常用常用:id 更常用 简单class差值总结vue 实例vue 模板 : 先 取 ࿰……
【hello Linux】环境变量
目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux🌷 在开始今天的内容之前,先来看一幅图片吧! 不知道你们是否和我一……
【Linux基础】常用命令整理
ls命令
-a选项,可以展示隐藏的文件和文件夹-l选项,以列表形式展示内容-h,需要和-l搭配使用,可以展示文件的大小单位ls -lah等同于la -a -l -h
cd命令(change directory)
语法:cd [Linux路径]……
客快物流大数据项目(一百一十二):初识Spring Cloud
文章目录
初识Spring Cloud
一、Spring Cloud简介
二、SpringCloud 基础架构图…
C和C++中的struct有什么区别
区别一: C语言中: Struct是用户自定义数据类型(UDT)。 C语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。
区别二:
C中的struct是没有权限设置的,……
docker的数据卷详解
数据卷 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方修改会立即同步
一个数据卷可以同时被多个容器同时挂载,一个容器也可以被挂载多个数据卷
数据卷作用:容器数据持久化 /外部机器和容器间接通信 /容器……
13、Qt生成dll-QLibrary方式使用
Qt创建dll,使用QLibrary类方式调用dll
一、创建项目
1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名,选择项目位置,下一步 3、选择MinGW,下一步 4、完成 5、.pro中添加TEMPLATE subdirsÿ……
基于mapreduce 的 minHash 矩阵压缩
Minhash作用: 对大矩阵进行降维处理,在进行计算俩个用户之间的相似度。
比如: 俩个用户手机下载的APP的相似度,在一个矩阵中会有很多很多的用户要比较没俩个用户之间的相似度是一个很大的计算任务 如果首先对这个矩阵降维处理&am……
关于hashmap使用迭代器的问题
keySet获得的只是key值的集合,valueSet获得的是value集合,entryset获得的是键值对的集合。 package com.test2.test;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;public class mapiterator……
编程日记2023/4/16 14:50:37