围绕计算机科学的漫步

主要观点:介绍如何在不重新实现编译器驱动程序的情况下,通过包装器脚本对 C 编译器及其预处理程序进行干预,以实现对编译过程的修改和控制,包括处理输入输出文件识别、分解驱动程序调用为子命令、处理预编译与编译的分离、精确扫描命令行参数等问题,同时探讨了相关的挑战和可能的改进方向。

关键信息:

  • 提出“新前门”和“后室”两种方法,“后室”方法更简单、健壮和通用,通过 -wrapper 和 -### 选项处理子命令的分解。
  • 对于 GCC 和 Clang,可通过添加 -no-integrated-cpp 使编译器和预处理程序分离,Clang 需使用 -traditional-cpp 来实现。
  • 精确扫描是确保脚本稳健的关键,需要完整了解每个子命令的命令行语法,包括选项参数。
  • 处理内部的 cc1 子命令,其选项与编译器驱动程序的选项有差异,需要进行转换和处理。
  • 提供工具时,采用提升为单个函数驱动程序调用的方式,避免使用 cpp 导致的问题。
  • 通过环境变量实现工具与包装器脚本之间的参数传递和扫描处理。

重要细节:

  • 给出了在不同系统上运行 GCC 编译 hello-world C 程序时生成的子命令示例。
  • 详细说明了在处理 Clang 时遇到的 -traditional-cpp 选项的问题及解决方法。
  • 强调了不同选项的语义和语法差异,如 -MD 在驱动程序和 cc1 中的不同。
  • 介绍了在处理汇编器和链接器时的情况,以及如何处理相关问题。
  • 讨论了包装器脚本的性能问题及优化方法,包括使用 awk 代码进行命令扫描等。
  • 提及了对编译过程中可自我重建的程序的思考和相关探索方向。
阅读 11
0 条评论