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

Che*_*anc 10 gcc binutils linux-toolchain

ar,nmranlib由binutils的包中提供的.gcc-ar,gcc-nmgcc-ranlib由GCC包提供.我听说的gcc-ar,gcc-nm以及gcc-ranlib是"有效的包装"周围ar,nmranlib二进制文件分别.

是什么之间的差异的技术gcc-ar,gcc-nm以及gcc-ranlibar,nmranlib?GCC必须在其构建中提供这些二进制文件.

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

Mik*_*han 9

gcc-ar是GNU的包装器,ar这样一个命令:

gcc-ar ...
Run Code Online (Sandbox Code Playgroud)

相当于:

ar --plugin=/path/to/liblto_plugin.so ...
Run Code Online (Sandbox Code Playgroud)

在我目前的系统上,Ubuntu 17.10,GCC 7.2,将是例如:

ar --plugin=/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so
Run Code Online (Sandbox Code Playgroud)

nm和之间有着相同的关系gcc-nm.

--pluginbinutils的备选方案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
Run Code Online (Sandbox Code Playgroud)

然后你会做你的链接时优化构建,如:

$ 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
Run Code Online (Sandbox Code Playgroud)

在最近的版本中binutils- 我不知道哪个是第一个; 在过去的3年或4年内 - liblto_plugin.so已默认加载arnm; 所以事实上:

$ 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
Run Code Online (Sandbox Code Playgroud)

会好起来的; 而nm foo.o将正常工作.但gcc-*版本还是服务与GCC被单独发货,因为你经常有目的arnm可能不支持默认情况下,如果没有的话,去年的构建,例如,将失败与未定义的引用联动,因为ar将无法插入存档一个真正的符号表foo.obar.o.