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

标签 gcc binutils linux-toolchain

ar , nm , 和 ranlib由 binutils 包提供。 gcc-ar , gcc-nm , 和 gcc-ranlib由 GCC 包提供。我在某处读到 gcc-ar , gcc-nm , 和 gcc-ranlibar 周围的“有效包装器” , nm , 和 ranlib二进制文件。
gcc-ar 之间的技术区别是什么? , gcc-nm , 和 gcc-ranlibar , nm , 和 ranlib ? GCC 在其构建中提供这些二进制文件一定是有原因的。

用户空间包的构建系统何时应该使用一个与另一个?如果用于构建用户空间包的工具链是基于 GCC 的,那么使用哪一个是否重要(例如,argcc-arnmgcc-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 的选项 arnm使他们能够动态地
为某些非默认格式的目标文件加载识别器/分析器
他们必须处理。

共享库 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 独立发货,因为您的常规 arnm可能不
支持该默认设置,如果不支持,则支持最后一个构建,例如,
由于ar,与 undefined reference 的链接将失败会失败
在存档中插入 foo.o 的真实符号表和 bar.o .

关于gcc - ar/nm 和 gcc-ar/gcc-nm 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48777554/

相关文章:

c - 为什么 int main() { return main();导致堆栈溢出而不是尾递归?

c# - 从 C# 应用程序调试 C .dll 文件

linux - 二进制文件在 RHEL6 上放置在 rc.local 中时无法在启动时运行。手动运行时会执行相同的二进制文件

arm - GCC 使用 ARM VFP 指令操作的正确内联汇编约束是什么?

linux - 为交叉工具链部署库

bash - 寻找大文件的 uniq -c 替代品

c - 原子比较(不等于)和交换

c++ - 为什么同样的代码通过gcc可以编译成功,而g++却不行?

linux - ELF 动态加载程序符号查找顺序

gcc - 在 CentOS 上构建整个工具链的教程