GCC Commands Underground

例子目录结构

project/
├── main.c
├── util.c
└── Makefile

GCC 子命令的执行时序图

sequenceDiagramparticipant U as Userparticipant G as gccparticipant C as cppparticipant CC as cc1participant A as asparticipant AR as arparticipant L as ldparticipant F as FilesU->>G: gcc main.c util.c -o main (简化命令)Note right of G: 开始多文件编译流程%% 处理 main.cG->>C: cpp 处理 main.cC->>F: 生成 main.iG->>CC: cc1 处理 main.iCC->>F: 生成 main.sG->>A: as 处理 main.sA->>F: 生成 main.o%% 处理 util.cG->>C: cpp 处理 util.cC->>F: 生成 util.iG->>CC: cc1 处理 util.iCC->>F: 生成 util.sG->>A: as 处理 util.sA->>F: 生成 util.o%% 可选:使用 ar 创建静态库Note right of G: 如果需要静态库,则插入 ar 步骤U->>AR: ar rcs libutil.a util.oAR->>F: 生成 libutil.aNote right of AR: 中间步骤:打包 util.o 为静态库%% 链接阶段G->>L: ld 处理 main.o 和 libutil.a (-lutil)L->>F: 生成 main (可执行文件)Note right of L: 链接时使用静态库G-->>U: 返回编译成功的可执行文件 main

Makefile 例子1,全部用子命令完成完整GCC预处理,编译,汇编,链接流程:

# 定义工具路径(根据系统调整)
CC1 = /usr/lib/gcc/x86_64-linux-gnu/11/cc1  # 请根据你的 gcc 版本调整路径
CPP = /usr/bin/cpp
AS = /usr/bin/as
LD = /usr/bin/ld
AR = /usr/bin/ar
RM = rm -f# 目标文件和依赖
all: main# 链接阶段:使用独立的 ld 命令
main: main.o libutil.a$(LD) -o main main.o -L. -lutil -lc# 汇编阶段:main.o
main.o: main.s$(AS) main.s -o main.o# 编译阶段:main.s
main.s: main.i$(CC1) main.i -o main.s# 预处理阶段:main.i
main.i: main.c$(CPP) main.c -o main.i# 静态库生成:libutil.a
libutil.a: util.o$(AR) rcs libutil.a util.o# 汇编阶段:util.o
util.o: util.s$(AS) util.s -o util.o# 编译阶段:util.s
util.s: util.i$(CC1) util.i -o util.s# 预处理阶段:util.i
util.i: util.c$(CPP) util.c -o util.i# 清理
clean:$(RM) *.o *.a *.i *.s main

Makefile 例子2: 用 gcc 来分阶段处理:

# 定义工具路径
GCC = /usr/bin/gcc
AR = /usr/bin/ar
RM = rm -f# 目标文件和依赖
all: main# 链接阶段:使用 gcc 调用 ld
main: main.o libutil.a$(GCC) main.o -L. -lutil -o main# 汇编阶段:main.o
main.o: main.s$(GCC) -c main.s -o main.o# 编译阶段:main.s
main.s: main.i$(GCC) -S main.i -o main.s# 预处理阶段:main.i
main.i: main.c$(GCC) -E main.c -o main.i# 静态库生成:libutil.a
libutil.a: util.o$(AR) rcs libutil.a util.o# 汇编阶段:util.o
util.o: util.s$(GCC) -c util.s -o util.o# 编译阶段:util.s
util.s: util.i$(GCC) -S util.i -o util.s# 预处理阶段:util.i
util.i: util.c$(GCC) -E util.c -o util.i# 清理
clean:$(RM) *.o *.a *.i *.s main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

龙哥量化:二重奏啊!同时用deepseek和腾讯元宝的Hunyuan大模型写技术指标和选股公式,把收集的公式源码传给他,可以像人一样思考

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 开源的deepseek非常爆火,大科技公司都纷纷接入ds。腾讯元宝也接入了, 可以选Hunyuan或者deepseek模型给你帮忙,…

【APP逆向35】frida反调试2

前言:有些app运行时会监测frida的相关特征,监测到之后就会直接闪退 示例:解决方法:可以尝试使用strongR-frida-android来绕过监测1.下载frida-server(加强版)下载地址:https://github.com/hzzheyang/strongR-frida-android/releases?page=4 找到frida对应的版本解压,上…

【作业】自我介绍

软件工程学第一节课作业:自我介绍+软工5问作业相关信息这个作业属于哪个课程🔗班级链接 这个作业要求在哪里🔗作业链接 这个作业的目标 1. 自我介绍 2. 软工五问作业一: 自我介绍 🚩Hi! I am Mike, a technology learner enthusiastic in new ideas and programs. Toge…

磁盘总结---特殊符号系列-正则概述

1.系统管理-补充 文件系统: 磁盘中文件的组织方式常见文件系统 说明xfs centos 7默认的文件系统即可ext4 centos 6.x ubuntu 默认的文件系统ext3 centos 5.x 默认的文件系统swap 交换分区,也算是个文件系统2.磁盘性能指标磁盘性能指标 说明吞吐量(读写速度) 一般值得是磁盘读…

多态的前提--java进阶day02

1.多态的前提条件第一点和第二点都很好理解,第三点父类引用指向子类对象是什么意思?以下图进行讲解我们以前的写法,如下图,叫做子类引用指向子类那父类引用呢?就是把左边换成父类Animal即可因为dog和cat都是Animal的子类,所以二者皆可用该种引用方式并不是所有的对象都可…

行内块应用

这是做的作业<!DOCTYPE html> <html lang="zh-cn"> <head><meta charset="UTF-8"><title>Title</title><style>.pics {width: 1850px;height: 700px;display: flex;justify-content: center; /* 水平居中 */ali…

基于NURBS曲线的数据拟合算法matlab仿真

1.程序功能描述 基于NURBS曲线的数据拟合算法,非均匀有理B样条(Non-Uniform Rational B-Splines,简称NURBS)曲线是一种强大的数学工具,广泛应用于计算机图形学、CAD/CAM系统、几何建模和数据拟合等领域。NURBS曲线通过控制顶点和权重,能够精确地表示复杂的曲线和曲面…

基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器

1.课题概述 基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器。2.系统仿真结果 (完整程序运行后无水印) 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介PEM(质子交换膜)燃料电池作为一种高效的能量转换装置,在众多领域中展现出广泛的应…

4、二次创作

将文件拖入软件中 添加标题 设置参数 使用空格遮挡字幕 加水印 导入已经识别的字幕 修改字幕参数