我发现,当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
功能...
答案 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相同。