如何自动获取相当于复杂的`gcc`调用的详细脚本?

问题描述 投票:0回答:1

我的理解是,在引擎盖下,一个简单的gcc调用如下:

% gcc -o hello hello.c

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

  • 链接器ld
  • 汇编程序as
  • 一个不起眼的可执行文件cc1,实际上是一个编译器。
  • 一个模糊的可执行文件collect2,其功能我很难总结。
  • 任意数量的其他命令。

所有这些都将使用大量的命令行参数和环境变量来调用。但是,据我所知,gcc可执行文件本身没有任何作用,也就是说,gcc的整个运行完全由它运行的命令描述,所以gcc的任何单个调用都等同于某些shell脚本。

有时需要定位在gcc运行期间执行的各个命令,要么单独更改和执行它们,跟踪构建过程中的错误,要么只是记录构建的细节。此外,有时需要跨多个构建配置,目标体系结构,优化参数等执行此类工作。

通过提供参数gcc并重定向到文件,可以从-v获得操作日志:

% gcc -o hello hello.c 2> gcc.log

不幸的是,这种方法本身并不提供易于执行,修改,版本控制等的脚本。相反,生成的日志将包含实际命令和任意注释的混合,例如gcc版本,所有这些都在统一列表中。然后,操作员可以手动标记注释或完全删除它,以便有希望获得可运行的shell脚本。

我如何(使ghc)自动生成这样的脚本?

gcc
1个回答
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
...
© www.soinside.com 2019 - 2024. All rights reserved.