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

20
arnmranlib由binutils包提供。gcc-argcc-nmgcc-ranlib由GCC包提供。我在某处看到,gcc-argcc-nmgcc-ranlib分别是arnmranlib二进制文件的"有效包装器"。

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

当用户空间包的构建系统使用其中一个时,何时应使用其中一个而不是另一个?如果用于构建用户空间包的工具链基于GCC,那么使用哪一个是否重要(例如,ar vs gcc-arnm vs gcc-nm)?

1个回答

18

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 选项可使它们动态地加载识别/分析器,以处理非默认格式的目标文件。

共享库 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 年内 - 默认情况下,arnm 加载了 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-* 版本仍然有自己的用处,因为你的普通 arnm 可能不支持该默认设置,如果不支持,则例如最后一次构建将在与未定义引用的链接中失败,因为 ar 无法将真实的符号表插入归档文件中,以用于 foo.obar.o


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接