gcc-ar
是GNU ar
的包装器,可以使用以下命令:
gcc-ar ...
等同于:
ar --plugin=/path/to/liblto_plugin.so ...
在我的当前系统 Ubuntu 17.10 上,GCC 7.2 的示例命令是:
ar --plugin=/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so
nm
和 gcc-nm
之间存在着相同的关系。
binutils 工具包中的 ar
和 nm
命令的 --plugin
选项可使它们动态地加载识别/分析器,以处理非默认格式的目标文件。
共享库 liblto_plugin.so
可以使它们处理在链接时优化构建中生成和使用的 IR(中间表示)目标文件。
因此,如果您按照以下方式进行普通的构建:
$ gcc -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -o prog main.o -L. -lfoobar
然后您可以进行链接时优化的构建,如下所示:
$ gcc -flto -c main.c foo.c bar.c
$ gcc-ar cr libfoobar.a foo.o bar.o
$ gcc -flto -o prog main.o -L. -lfoobar
在最近的一些 binutils
发布版本中 - 我不知道是哪个是首个;在过去的 3 或 4 年内 - 默认情况下,ar
和 nm
加载了 liblto_plugin.so
; 因此实际上:
$ gcc -flto -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -flto -o prog main.o -L. -lfoobar
会正常工作;并且 nm foo.o
也会正常工作。但是 gcc-*
版本仍然有自己的用处,因为你的普通 ar
和 nm
可能不支持该默认设置,如果不支持,则例如最后一次构建将在与未定义引用的链接中失败,因为 ar
无法将真实的符号表插入归档文件中,以用于 foo.o
和 bar.o
。