据我了解,在幕后,简单的&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
)自动生成这样的脚本?
答案 0 :(得分:1)
首先请注意,仅命令行调用是不够的-GCC通过环境变量(COMPILER_PATH
,COLLECT_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
...