centos编译c

GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器,当时只支持C语言。 后来又扩展能够支持更多编程语言,包括 C++、Fortran 和 Java 等。
gcc -v 查询版本
通过which gcc 查询gcc安装路径

在这里插入图片描述

GCC编译工具链:
GCC编译工具链(toolchain),是指以GCC编译器为核心的一整套工具。它主要包含以下三部分内容:
gcc-core:即GCC编译器,用于完成预处理和编译过程,把C代码转换成汇编代码。
Binutils :除GCC编译器外的一系列小工具包括了链接器ld,汇编器as、目标文件格式查看器readelf等。
glibc:包含了主要的 C语言标准函数库,C语言中常常使用的打印函数printf、malloc函数就在glibc 库中。
在很多场合下会直接用GCC编译器来指代整套GCC编译工具链。

Binutils工具集:
Binutils(bin utility),是GNU二进制工具集,通常跟GCC编译器一起打包安装到系统,它的官方说明网站地址为: https://www.gnu.org/software/binutils/ 。
在进行程序开发的时候通常不会直接调用这些工具,而是在使用GCC编译指令的时候由GCC编译器间接调用。下面是其中一些常用的工具:
as:汇编器,把汇编语言代码转换为机器码(目标文件)。
ld:链接器,把编译生成的多个目标文件组织成最终的可执行程序文件。
readelf:可用于查看目标文件或可执行程序文件的信息。
nm : 可用于查看目标文件中出现的符号。
objcopy: 可用于目标文件格式转换,如.bin 转换成 .elf 、.elf 转换成 .bin等。
objdump:可用于查看目标文件的信息,最主要的作用是反汇编。
size:可用于查看目标文件不同部分的尺寸和总尺寸,例如代码段大小、数据段大小、使用的静态内存、总大小等。
系统默认的Binutils工具集位于/usr/bin目录下,可使用如下命令查看系统中存在的Binutils工具集:
在Ubantu上执行如下命令ls /usr/bin/ | grep linux-gnu-
Centos使用此指令没有反应

在Ubantu上执行如下命令# 以下是Ubuntu 64位机的glibc库文件路径,可直接执行/lib/x86_64-linux-gnu/libc.so.6

GCC 编译工具链在编译一个C源文件时需要经过以下 4 步:
预处理:为把头文件的代码、宏之类的内容转换成生成的.i文件,还是C代码。
编译:把预处理后的.i文件通过编译成.s文件,汇编语言。
汇编:将汇编语言文件生成目标文件.o文件,机器码。
链接:将每个源文件对应的.o文件链接起来,就生成一个可执行程序文件。
在这里插入图片描述

静态链接
特点:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。因此,链接器需要知道参与链接的目标文件需要哪些函数,同时也要知道每个目标文件都能提供什么函数,这样链接器才能知道是不是每个目标文件所需要的函数都能正确地链接。如果某个目标文件需要的函数在参与链接的目标文件中找不到的话,链接器就报错了。目标文件中有两个重要的接口来提供这些信息:一个是符号表,另外一个是重定位表。
优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行。
缺点:
程序体积会相对大一些。
如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。

动态链接
特点: 在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。
优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
缺点: 由于是运行时加载,可能会影响程序的前期执行性能。

上面的文章多次提到库(lib)这个概念,所谓的库就 是一些功能代码经过编译连接后的可执行形式。
大家在Windows平台上见到的.dll文件和linux平台下so动态库都输入库。
库也有静态lib和动态lib之分:
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持

编写hello.c文件
在这里插入图片描述

先把hello.c编译成hello.s文件

CAT hello.s

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

使用man 3 pow找到pow方法链接库 -lm
在这里插入图片描述

man 3 putchar 不需要链接库

例子
man -k printf
查询某个参数作用

man 3 printf
要访问库函数printf的manual page

因此创建汇编时可以直接带上链接形成可执行文件
在这里插入图片描述

Centos只能 使用静态链接

在这里插入图片描述查询依赖库
在这里插入图片描述

社区地址:https://eco.dameng.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值