如何自动获得与复杂的gcc调用等效的详细脚本?

时间:2019-04-28 06:07:52

标签: gcc

据我了解,在幕后,简单的&Vec<Vec<usize>>调用如下:

HashMap

-实际上可以调用几个单独的可执行文件,可能隐藏在gcc安装中。这些可能是:

  • 链接器% gcc -o hello hello.c
  • 汇编器gcc
  • 模糊的可执行文件ld实际上是编译器。
  • 晦涩难懂的可执行文件as,其功能我很难总结。
  • 任何其他命令。

所有这些都将被大量的命令行参数和环境变量调用。但是,据我了解,cc1可执行文件本身不会执行任何操作,也就是说, collect2的整个运行完全由运行的命令来描述,因此任何单个gcc的调用等效于某些Shell脚本。

有时希望定位在运行gcc时执行的各个命令,以分别更改和执行它们,跟踪构建过程中的错误,或者只是记录构建的细节。此外,有时需要跨多个构建配置,目标体系结构,优化参数等执行这种工作。

可以通过提供参数gcc并重定向到文件来从gcc获取操作日志:

gcc

不幸的是,该方法本身并不提供可以容易地执行,更改,版本控制等的脚本。而是,生成的日志将包含实际命令和任意注释(例如-v版本)的混合所有内容,并且均在统一的列表中。然后,操作员可以手动将注释本身这样标记或将其完全删除,以期希望获得可运行的shell脚本。

我如何(使% gcc -o hello hello.c 2> gcc.log 自动生成这样的脚本?

1 个答案:

答案 0 :(得分:1)

首先请注意,仅命令行调用是不够的-GCC通过环境变量(COMPILER_PATHCOLLECT_GCC_OPTIONS等)以及内部包含编译器选项的临时文件传递附加选项(后者是仅在LTO编译中使用的AFAIK)。

您可以通过sed轻松提取编译命令:

$ gcc tmp.c -### 2>&1
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/lto-wrapper.exe
Target: x86_64-pc-cygwin
Configured with: ...
Thread model: posix
gcc version 6.4.0 (GCC)
COLLECT_GCC_OPTIONS='-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/cc1.exe -quiet -Dunix -idirafter /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../lib/../include/w32api -idirafter /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/lib/../lib/../../include/w32api tmp.c -quiet -dumpbase tmp.c "-mtune=generic" "-march=x86-64" -auxbase tmp -o /tmp/cco2cExb.s
...
$ gcc tmp.c -### 2>&1 | sed -ne '/^[A-Z_0-9]\+=/{ s/^\([^=]\+\)=\(.*\)/export \1="\2"/; s/'\''//g; p}; /^ /{p}'
export COLLECT_GCC="gcc"
export COLLECT_LTO_WRAPPER="/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/lto-wrapper.exe"
export COLLECT_GCC_OPTIONS="-mtune=generic -march=x86-64"
 /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/cc1.exe -quiet -Dunix -idirafter /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../lib/../include/w32api -idirafter /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/lib/../lib/../../include/w32api tmp.c -quiet -dumpbase tmp.c "-mtune=generic" "-march=x86-64" -auxbase tmp -o /tmp/ccZSUbZx.s
...