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
。
--plugin
binutils的选项ar
使nm
他们能够为他们必须处理的某些非默认格式的目标文件动态加载识别器/分析器。
共享库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 年内 -liblto_plugin.so
默认情况下已由ar
and加载nm
;所以事实上:
$ 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-*
版本仍然具有与 GCC 一起独立发布的目的,因为您的常规版本ar
可能nm
不支持该默认值,如果不支持,那么最后一个版本将在与未定义引用的链接中失败,因为ar
将无法插入存档foo.o
和的真实符号表bar.o
。