1. 查看编译器的版本
[/path/to/]gcc --version
2. 查看编译器预定义的宏
[/path/to/]gcc [options] -dM -E - <<<''
3. 默认链接脚本
[/path/to/]ld --verbose
根据输出,可以得到链接相关的信息。
例如,对于Linux PC机上的gcc工具链,可以得到类似如下的链接相关的信息。
OUTPUT_ARCH(i386)
ENTRY(_start)
SEARCH_DIR("/usr/i686-redhat-linux/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
3. 查看二级优化选项执行了哪些优化
[path/to/]gcc -Q -O2 --help=optimizers
输出类似如下内容
The following options control optimizations:
-O<number>
-Os
-falign-functions [enabled]
-falign-jumps [enabled]
-falign-labels [enabled]
-falign-loops [disabled]
-fargument-alias [enabled]
-fargument-noalias [disabled]
-fargument-noalias-anything [disabled]
-fargument-noalias-global [disabled]
-fasynchronous-unwind-tables [enabled]
4. 查看编译器实际使用了哪些选项
touch test.c
[path/to/]gcc [options] -fverbose-asm -S test.c
cat test.s
5. 链接时允许符号冲突
有时候同一个程序使用了多个静态库,而多个库中的不同.o文件都需要链接到可执行程序中。
然而,这些.o文件有符号名的冲突。怎么办呢?
在链接命令中,使用 --allow-multiple-definition这个选项即可(可以将他追加到LDFLAGS中)。
当然,这是非常危险的。因为不同的地方,对此符号是怎么定义的,怎么使用的,都不清楚。