ar/nm 和 gcc-ar/gcc-nm 有什么区别?
What is the difference between ar/nm and gcc-ar/gcc-nm?
ar
、nm
和 ranlib
由 binutils 包提供。 gcc-ar
、gcc-nm
和 gcc-ranlib
由 GCC 包提供。我在某处读到 gcc-ar
、gcc-nm
和 gcc-ranlib
在 ar
、nm
和 ranlib
二进制文件周围是 "effectively wrappers"分别。
gcc-ar
、gcc-nm
和 gcc-ranlib
与 ar
、nm
和 ranlib
之间的技术区别是什么? GCC 在其构建中提供这些二进制文件一定是有原因的。
用户空间包的构建系统什么时候应该使用一个与另一个?如果用于构建用户空间包的工具链是基于 GCC 的,那么你使用哪一个有关系吗(例如,ar
vs gcc-ar
,nm
vs 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
之间的关系是一样的。
binutils ar
和 nm
的 --plugin
选项使它们能够动态地
为某些 non-default 格式的目标文件加载 recognizer/analyser
他们必须处理。
共享库 liblto_plugin.so
使他们能够处理
在 link-time-optimized 中生成和使用的 IR(中间表示)对象文件
构建。
所以,如果您要像这样进行普通的旧构建:
$ gcc -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -o prog main.o -L. -lfoobar
然后您将 link-time-optimized 构建为:
$ 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
会失败
为 foo.o
和 bar.o
在存档中插入一个真正的符号 table。
ar
、nm
和 ranlib
由 binutils 包提供。 gcc-ar
、gcc-nm
和 gcc-ranlib
由 GCC 包提供。我在某处读到 gcc-ar
、gcc-nm
和 gcc-ranlib
在 ar
、nm
和 ranlib
二进制文件周围是 "effectively wrappers"分别。
gcc-ar
、gcc-nm
和 gcc-ranlib
与 ar
、nm
和 ranlib
之间的技术区别是什么? GCC 在其构建中提供这些二进制文件一定是有原因的。
用户空间包的构建系统什么时候应该使用一个与另一个?如果用于构建用户空间包的工具链是基于 GCC 的,那么你使用哪一个有关系吗(例如,ar
vs gcc-ar
,nm
vs 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
之间的关系是一样的。
binutils ar
和 nm
的 --plugin
选项使它们能够动态地
为某些 non-default 格式的目标文件加载 recognizer/analyser
他们必须处理。
共享库 liblto_plugin.so
使他们能够处理
在 link-time-optimized 中生成和使用的 IR(中间表示)对象文件
构建。
所以,如果您要像这样进行普通的旧构建:
$ gcc -c main.c foo.c bar.c
$ ar cr libfoobar.a foo.o bar.o
$ gcc -o prog main.o -L. -lfoobar
然后您将 link-time-optimized 构建为:
$ 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
会失败
为 foo.o
和 bar.o
在存档中插入一个真正的符号 table。