gcc工具链杂记

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                  
  -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中)。

当然,这是非常危险的。因为不同的地方,对此符号是怎么定义的,怎么使用的,都不清楚。

你可能感兴趣的:(杂谈,Linux应用开发技术)