尚硅谷Linux应用层学习笔记(一)GCC编译

一、编译流程

.c源文件 => 预处理 => 编译 => 汇编 => 链接 => 可执行文件

1. 预处理 gcc -E

cpp 复制代码
# 预处理main.c,得到预处理后的文件main.i
# .i为预处理文件的统一后缀

gcc -E main.c -o main.i 

有以下目的:

  • 调试宏定义是否展开
  • 查看引入.h文件后的完整代码
  • 排查条件编译引入的问题

2. 编译 gcc -S

cpp 复制代码
# 编译main.c,生成编译后的汇编文件main.s
# .s为汇编文件的后缀
gcc -S main.c -o main.s

这一步主要用来分析汇编代码

3. 汇编(生成目标文件但不进行链接) gcc -c

cpp 复制代码
# 汇编main.c,输出目标文件main.o
gcc -c main.c -o main.o

将各.c文件编译为.o文件,各个.o文件链接后生成可执行文件

4. 链接

链接的操作就是将各个.o文件内相互引用的函数、变量等链接起来,找到各自的符号,然后再输出一个可执行文件。

二、objdump工具

  1. 反汇编二进制文件(代码段)
  2. 查看源码的section信息
  3. 查看符号表查看头文件

三、静态链接与动态链接

  1. 静态链接

GCC会尝试将所有用到的库函数直接链接到最终生成的可执行文件中

  1. 动态链接

库只有在被调用时才被加载进文件中,而不是全部加载到文件中进行编译。所以动态链接的可执行文件比静态链接的小。

main为静态链接,main1为动态链接,二者.c文件相同,但不同的链接方式造成编译后文件出现较大的体积差异,主要是因为静态链接将stdio内的函数链接到了可执行文件中。

相关推荐
超级大只老咪7 小时前
快速进制转换
笔记·算法
嵩山小老虎8 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模8 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324478 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.9 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
一只自律的鸡10 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)10 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen10 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
ling___xi10 小时前
《计算机网络》计网3小时期末速成课各版本教程都可用谢稀仁湖科大版都可用_哔哩哔哩_bilibili(笔记)
网络·笔记·计算机网络