如果编译器搜索路径中存在real-ld可执行文件,如何强制GCC使用ld.gold?

时间:2019-02-06 16:22:16

标签: gcc gold-linker

我发现,当GCC(在GCC 4.8和GCC 6.4上试用)在其搜索路径中找到import numpy as np import matplotlib.pyplot as plt from matplotlib import animation def simulate(*args): global ground_state ground_state = np.random.randn(5,5) simulate() fig = plt.figure() im = plt.imshow(ground_state, animated = True) def update_fig(*args): global ground_state simulate(ground_state, 100000, 2.4) im.set_data(ground_state) return im ani = animation.FuncAnimation(fig, update_fig, interval = 50) plt.show() 个可执行文件时,它会默默地忽略real-ld选项,并使用-fuse-ld=...而不是适当的链接器。

real-ld

通常,如果没有$ echo "int main(){}" > script.c $ ln -s /usr/bin/ld real-ld $ gcc -fuse-ld=gold -B$PWD script.c $ readelf --string-dump=.note.gnu.gold-version a.out readelf: a.out: Warning: Section '.note.gnu.gold-version' was not dumped because it does not exist! ,它将按预期工作:

real-ld

Documentation of GCC建议使用$ echo "int main(){}" > script.c $ gcc -fuse-ld=gold script.c $ readelf --string-dump=.note.gnu.gold-version a.out String dump of section '.note.gnu.gold-version': [ c] GNU [ 10] gold 1.12 链接程序。

Documentation of collect2并未提及gold功能...

2 个答案:

答案 0 :(得分:1)

tl; dr这是不可能的[2]。这是一项功能。

我已经深入研究了GCC的collect2.c source code,它的历史和collect2 documentation,得出的结论是,根据这些文件,real-ld的行为应该优先于所有其他二进制文件[1]。

但是,启用-fuse-ld=...时,搜索 real ld的逻辑比较模糊,并且在文档中没有反映...

根据源代码,据我了解C语言,-fuse-ld=...功能仅在collect2尝试搜索ld时有效。

[1]一个例外是使用--with-ld=...编译GCC时,但仅适用于非交叉编译器。如果无法重建GCC(或使用交叉编译器),它什么也没有。

[2]并非完全正确。刚开始想到创建一个自己的real-ld并执行ld.gold,并修改编译器搜索路径(使用-B而不是-fuse-ld=...):

$ cat /path/to/real-ld/real-ld
#!/bin/sh
exec ld.gold "$@"

$ gcc -B /path/to/real-ld/ ...

答案 1 :(得分:0)

删除real-ld并在其中放置ld。指向您要使用的链接器。如果存在ld.gold,则-fuse-ld = gold可以使用,与ld.bfd相同。