尚硅谷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内的函数链接到了可执行文件中。

相关推荐
M78佐菲2 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx2 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做2 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
噜~噜~噜~3 小时前
操作系统笔记-2.3.5.1.1生产者-消费者问题
笔记·操作系统
yi.Ist3 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
一池秋_4 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
惜离殇4 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
骐骥16 小时前
学习:javaScriptProxy和registerJavaScriptProxy有什么区别,能注册多少个对象
学习·鸿蒙
Huathy-雨落江南,浮生若梦7 小时前
Caddy 学习笔记 - 反向代理与 IP 封禁
笔记·学习·tcp/ip
闲云野鹤在人间7 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack