当前位置: 首页 > article >正文

GCC RISCV 后端 -- cc1 入口

        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.kler.cn/a/573969.html

相关文章:

  • 【五.LangChain技术与应用】【30.LangChain Agent小案例2:复杂场景下的代理设计】
  • 客户端及时通讯系统(1)
  • 【YOLOv12改进trick】StarBlock引入YOLOv12,创新涨点优化,含创新点Python代码,方便发论文
  • postman--接口测试工具安装和使用教程
  • LinkedList 双向链表
  • VEC系列-RabbitMQ 入门笔记
  • 快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
  • 基于开源 AI 大模型、AI 智能名片及 S2B2C 商城小程序源码的个人 IP 用户运营策略研究
  • 物联网感知层采集的数据 经过etl 后 ,输送给ai 训练模型 和模型本身调优
  • 代码随想录算法训练营第三十九天 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍 III
  • 【Unity】改变游戏运行时Window的窗口标题
  • Java Spring Boot中Model与Entity的区别与联系及多表关联查询的实现
  • 6.过拟合处理:确保模型泛化能力的实践指南——大模型开发深度学习理论基础
  • python+pytest 接口自动化测试:参数关联
  • 【橘子python】在vscode中配置py3
  • 微服务架构下的 Node.js
  • 【Pandas】pandas Series swaplevel
  • ICLR 2025|香港浸会大学可信机器学习和推理课题组专场
  • 大语言模型中Top-K和Top-P是两种核心的文本生成策略
  • 大模型中的剪枝、蒸馏是什么意思?