ar
, nm
, 和 ranlib
由 binutils 包提供。 gcc-ar
, gcc-nm
, 和 gcc-ranlib
由 GCC 包提供。我在某处读到 gcc-ar
, gcc-nm
, 和 gcc-ranlib
是 ar
周围的“有效包装器” , nm
, 和 ranlib
二进制文件。gcc-ar
之间的技术区别是什么? , gcc-nm
, 和 gcc-ranlib
与 ar
, nm
, 和 ranlib
? GCC 在其构建中提供这些二进制文件一定是有原因的。
用户空间包的构建系统何时应该使用一个与另一个?如果用于构建用户空间包的工具链是基于 GCC 的,那么使用哪一个是否重要(例如,ar
与 gcc-ar
,nm
与 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
nm
之间的关系相同。和 gcc-nm
.--plugin
binutils 的选项 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
然后你会做你的链接时间优化构建,如:
$ 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 独立发货,因为您的常规
ar
和 nm
可能不支持该默认设置,如果不支持,则支持最后一个构建,例如,
由于
ar
,与 undefined reference 的链接将失败会失败在存档中插入
foo.o
的真实符号表和 bar.o
.
关于gcc - ar/nm 和 gcc-ar/gcc-nm 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48777554/