ar
,nm
和ranlib
。 GCC包提供gcc-ar
,gcc-nm
和gcc-ranlib
。我在某处读到gcc-ar
,gcc-nm
和gcc-ranlib
分别围绕ar
,nm
和ranlib
二进制文件“有效包装”
gcc-ar
,gcc-nm
和gcc-ranlib
与ar
,nm
和ranlib
之间的技术差异是什么? GCC必须在其构建中提供这些二进制文件。
userland软件包的构建系统何时应该使用一个而另一个?如果用于构建userland包的工具链是基于GCC的,那么您使用哪一个(例如ar
vs gcc-ar
,nm
vs gcc-nm
)是否重要? / p>
答案 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
nm
和gcc-nm
之间存在相同的关系。
binutils --plugin
和ar
的{{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.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-*
和ar
可能不会
支持默认,如果不支持那么最后一次构建,例如,
由于nm
失败,因此与未定义引用的链接会失败
在档案中插入ar
和foo.o
的真实符号表。