GCC RISCV 后端 -- cc1 入口

embedded/2025/3/6 16:55:22/

        GCC编译工具链中的 gcc 可执行程序,实际上是个驱动程序(Driver),其根据输入的参数,然后调用其它不同的程序,对输入文件进行处理,包括编译、链接等。可以通过以下命令查看:

gcc -v hello.c
$ gcc -v hello.c
.../usr/libexec/gcc/x86_64-linux-gnu/13/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello.c -quiet -dumpdir a- -dumpbase hello.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccNZ9EWv.s
...
as -v --64 -o /tmp/ccXjJNFZ.o /tmp/ccNZ9EWv.s
.../usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccCoWozh.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro 
/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. /tmp/ccXjJNFZ.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a.'

        也就是 gcc 根据其输入参数,驱动(Driver)了其它工具来最终完成整个编译的任务。

        其中,属于编译器部分的是 cc1 程序。其源代码入口为 <gcc-project>/gcc/main.cc 中的 main 函数:

        找到程序入口后,就可以顺着程序的代码逻辑,一步步往下看 cc1 程序的代码了。

        这里,有个认识点,就是,在查阅源代码时,要注意对代码的抽象理解。具体到C/C++的代码时,其最小抽象单元是函数,也就是理解函数在业务逻辑中的抽象意涵,也就是,知道函数的原型(Prototype),即其输入、输出、函数名,就能明白其作用。再往上抽象一层就是,类(Class),即对数据结构及相关处理函数的封装。再往上一层抽象就是库(library)。再往上就是包(Package)。这样一步步往上抽象,来组织管理整个程序代码,以使得其复杂度可以控制在便于维护及理解的程度。


http://www.ppmy.cn/embedded/170525.html

相关文章

UV安装GPU版本PyTorch

经过同事推荐&#xff0c;开始尝试使用uv管理Python环境&#xff0c;效果相当不错。 安装PyTorch遇到的问题 但在安装PyTorch时&#xff0c;采用默认的uv add方式会报错&#xff0c;而使用uv pip install安装PyTorch的cuda版本&#xff0c;虽然没有问题&#xff0c;但并不能同…

C++(蓝桥杯常考点)

前言&#xff1a;这个是针对于蓝桥杯竞赛常考的C内容&#xff0c;容器这些等下棋期再讲 C 在DEVC中注释和取消注释的方法&#xff1a;ctrl/ ASCII值&#xff08;常用的&#xff09;&#xff1a; A-Z:65-90 a-z:97-122 0-9:48-57 换行/n:10科学计数法&#xff1a;eg&#xff1a…

10.RabbitMQ集群

十、集群与高可用 RabbitMQ 的集群分两种模式,一种是默认集群模式,一种是镜像集群模式&#xff1b; 在RabbitMQ集群中所有的节点(一个节点就是一个RabbitMQ的broker服务器) 被归为两类:一类是磁盘节点,一类是内存节点&#xff1b; 磁盘节点会把集群的所有信息(比如交换机、绑…

vscode远程连接ubuntu/Linux(虚拟机同样适用)

前言 在现代开发环境中&#xff0c;远程工作和跨平台开发变得越来越普遍。Visual Studio Code&#xff08;VSCode&#xff09;作为一个流行的代码编辑器&#xff0c;提供了强大的远程开发功能&#xff0c;使得开发者能够高效地连接和管理远程 Linux 服务器上的项目。通过 VSCod…

【MySQL】索引|作用|底层数据结构|常见问题

目录 1.概念 2.为何引入 3.使用 &#xff08;1&#xff09;查看索引 &#xff08;2&#xff09;创建索引&#xff08;危险操作&#xff09; &#xff08;3&#xff09;删除索引&#xff08;危险操作&#xff09; 4.使用场景 &#x1f525;5.底层数据结构&#xff08;核…

使用300M带宽是否可以流畅地玩原神

本文来自腾讯元宝 ps&#xff1a;搬家了&#xff0c;需要装个路由器打游戏。 根据搜索结果&#xff0c;300M的网络带宽完全可以满足《原神》的流畅游玩需求。以下是具体分析及优化建议&#xff1a; 一、带宽需求与300M网络的适配性 ​带宽要求较低​ 《原神》作为一款开放世界…

《Python百练成仙》31-40章(不定时更新)

第卅一章 函数结丹def开紫府 罗酆山的鬼门关吞吐着猩红的变量阴风&#xff0c;每个风眼都涌动着作用域混乱的灵力乱流。叶军手握薛香遗留的丹田玉简&#xff0c;玉简表面浮现出残缺的函数符文&#xff1a; def 凝聚金丹(灵气):道基 灵气 * 0.618print(金丹品质) # 作用域外变…

iOSUITableVIewCell 自动化点击埋点

iOS 中&#xff0c;经常要实现UITableVIewCell 点击埋点&#xff0c;这里通过自动化埋点的方式进行实现。 思路&#xff1a;通过运行时hook tableViewCell的 setSelected:animated:方法&#xff0c; 在交换的方法中实现埋点逻辑&#xff0c;并调用原来的实现 cell分类 propert…