ar/nm 和 gcc-ar/gcc-nm 有什么区别?

What is the difference between ar/nm and gcc-ar/gcc-nm?

arnmranlib 由 binutils 包提供。 gcc-argcc-nmgcc-ranlib 由 GCC 包提供。我在某处读到 gcc-argcc-nmgcc-ranlibarnmranlib 二进制文件周围是 "effectively wrappers"分别。

gcc-argcc-nmgcc-ranlibarnmranlib 之间的技术区别是什么? GCC 在其构建中提供这些二进制文件一定是有原因的。

用户空间包的构建系统什么时候应该使用一个与另一个?如果用于构建用户空间包的工具链是基于 GCC 的,那么你使用哪一个有关系吗(例如,ar vs gcc-arnm vs gcc-nm)?

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

nmgcc-nm之间的关系是一样的。

binutils arnm--plugin 选项使它们能够动态地 为某些 non-default 格式的目标文件加载 recognizer/analyser 他们必须处理。

共享库 liblto_plugin.so 使他们能够处理 在 link-time-optimized 中生成和使用的 IR(中间表示)对象文件 构建。

所以,如果您要像这样进行普通的旧构建:

$ gcc -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -o prog main.o -L. -lfoobar

然后您将 link-time-optimized 构建为:

$ 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 默认加载 和 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 独立发货,因为您的常规 arnm 可能不会 支持该默认值,如果不支持则最后一个构建,例如, 与未定义引用的链接会失败,因为 ar 会失败 为 foo.obar.o 在存档中插入一个真正的符号 table。