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

时间:2018-02-13 23:50:27

标签: gcc binutils linux-toolchain

binutils包提供了

arnmranlib。 GCC包提供gcc-argcc-nmgcc-ranlib。我在某处读到gcc-argcc-nmgcc-ranlib分别围绕arnmranlib二进制文件“有效包装”

gcc-argcc-nmgcc-ranlibarnmranlib之间的技术差异是什么? GCC必须在其构建中提供这些二进制文件。

userland软件包的构建系统何时应该使用一个而另一个?如果用于构建userland包的工具链是基于GCC的,那么您使用哪一个(例如ar vs gcc-arnm vs gcc-nm)是否重要? / p>

1 个答案:

答案 0 :(得分:7)

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 --pluginar的{​​{1}}选项可让它们动态生成 为一些非默认格式的目标文件加载一个识别器/分析器 他们必须处理。

共享库nm是一个使他们能够处理的共享库 IR(中间表示)在链接时优化中生成和使用的目标文件 生成。

所以,如果你想做这样简单的旧版本:

liblto_plugin.so

然后您执行链接时优化的构建,如:

$ 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 的最新版本中 - 我不知道哪个是第一个;在...内 过去3年或4年 - binutils默认加载liblto_plugin.soar;所以事实上:

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失败,因此与未定义引用的链接会失败 在档案中插入arfoo.o的真实符号表。