Che*_*anc 10 gcc binutils linux-toolchain
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必须在其构建中提供这些二进制文件.
userland包的构建系统何时应该使用一个而不是另一个?如果用于构建userland包的工具链是基于GCC的,那么您使用哪一个(例如,arvs gcc-ar,nmvs gcc-nm)是否重要?
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已默认加载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
Run Code Online (Sandbox Code Playgroud)
会好起来的; 而nm foo.o将正常工作.但gcc-*版本还是服务与GCC被单独发货,因为你经常有目的ar和nm可能不支持默认情况下,如果没有的话,去年的构建,例如,将失败与未定义的引用联动,因为ar将无法插入存档一个真正的符号表foo.o和bar.o.
| 归档时间: |
|
| 查看次数: |
3636 次 |
| 最近记录: |