【发布时间】:2019-06-02 14:36:13
【问题描述】:
我想选择性地静态链接libm.a,动态链接所有其他库(包括libc.so)。但是,如果我使用来自 math.h 的数学函数,它几乎总是无法正确链接。为什么?
为什么它有时会起作用? (例如,如果我只使用sqrt、fabs 或奇怪的是tanh,它似乎链接正确)
myscript.sh:
#!/bin/bash
for i in sqrt tanh sin tan
do
echo "-----$i----------"
sed "s/ciao/$i/" prova.c >provat.c
gcc provat.c -fno-builtin -l:libm.a
[[ $? -eq 0 ]] && { echo -n "$i(2.0)="; ./a.out; echo " OK!"; }
echo
done
prova.c:
#include <stdio.h>
#include <math.h>
int main()
{
printf("%f", ciao(2.0));
return 0;
}
如果我运行myscript.sh,我可以看到sqrt 和tanh 没有问题。 sin 和 tan 链接失败:
$./myscript.sh
-----sqrt----------
sqrt(2.0)=1.414214 OK!
-----tanh----------
tanh(2.0)=0.964028 OK!
-----sin----------
/usr/lib/x86_64-linux-gnu/libm-2.27.a(s_sin.o): In function `__sin_ifunc':
(.text+0x4d42): undefined reference to `_dl_x86_cpu_features'
/usr/lib/x86_64-linux-gnu/libm-2.27.a(s_sin.o): In function `__cos_ifunc':
(.text+0x4da2): undefined reference to `_dl_x86_cpu_features'
collect2: error: ld returned 1 exit status
-----tan----------
/usr/lib/x86_64-linux-gnu/libm-2.27.a(s_tan.o): In function `__tan_ifunc':
(.text+0x5782): undefined reference to `_dl_x86_cpu_features'
collect2: error: ld returned 1 exit status
我不明白这些错误信息。有人可以解释会发生什么吗?
为什么我不能静态链接libm.a(其余的动态链接)?为什么它有时会起作用?
注意:我对 GCC 使用了 -fno-builtin 标志,因此 GCC 不使用它的任何内置函数。所以问题不存在。
【问题讨论】:
-
来自bugzilla.redhat.com/show_bug.cgi?id=1433347
Either the entire implementation of the runtime is statically linked or none of it is statically linked. -
你能解释一下这是为什么吗?是否在某些文档中进行了解释?为什么有时会起作用?谢谢
-
我发布的链接中的答案中对此进行了解释。你还需要什么?如果您在没有静态 C 库的其他部分的情况下链接
libm.a,您将得到未解析的符号,因为 ABI 不完整。 -
我看到了那个链接。它只是非常含糊地说明了这一事实。那么为什么它可以与
sqrt、fabs、tanh一起使用呢? -
@KamilCuk 你刚刚发布了一个指向第一个谷歌结果的链接。您还没有解释为什么
tanh有效而tan无效。
标签: c linux gcc compilation static-linking