- 主题:请教一个gcc的问题 (转载)
【 以下文字转载自 CProgramming 讨论区 】
发信人: il15 (il15), 信区: CProgramming
标 题: 请教一个gcc的问题
发信站: 水木社区 (Sat Aug 1 10:44:13 2020), 站内
我有一个数值计算的程序,用gcc4.8.x编译的时候优化不好,需要用到6.3.0以上的版本。这时候用2.17以上的glibc没有问题。
但是客户那边glibc比较古老,所以我要用回低版本的glibc,但这时候用gcc编译就会出问题,貌似它把exp()解析成 __exp_finite(),但是__exp_finite()在低版本的glibc是没有的。
想请教一下有什么解决的方法不...
--
FROM 116.4.9.*
好,多谢!
我刚才查了下gcc的头文件,有个发现:在 bits/math-finite.h 里面有这样的声明:
extern double __REDIRECT_NTH (exp, (double), __exp_finite);
__REDIRECT_NTH 在sys/cdefs.h 里面定义如下:
#if defined __GNUC__ && __GNUC__ >= 2
define __REDIRECT_NTH(name, proto, alias) name proto __asm__ (__ASMNAME (#alias)) __THROW
#endif
从名字上来看,好像是把exp重定义成了__exp_finite,不知道通过这里有没有其他一些解决的方法,比如undef __GNUC之类的。
不过 name proto __asm__ (__ASMNAME (#alias)) __THROW 这种写法展开来真是不好理解...
【 在 hgoldfish 的大作中提到: 】
: 如果你的优化只是编译器相关,不涉及到 glibc 的话,可以抛弃 glibc,改用 musl 静态
: 编译一下。
: 下载 musl,make && make install 以后,就生成 musl-gcc. 这是一个脚本,给 gcc 添加了额外的命令行。用这个编译器编译的程序,会把 glibc 依赖替换成 musl, 你可以给你的程序加上 -static 参数,或者不搞静态,把 musl 的 .so 一起复制过去就行了。
: ...................
--
FROM 116.4.11.*
网上查了下,似懂非懂。
然后我看了下系统,在lib64下面 /lib64/ld-linux-x86-64.so.2 -> ld-2.17.so
你的意思是通过 /lib64/ld-2.17.so exec_file options
然后在options里面指定库的搜索路径,不让它从系统的默认顺序路径查找,而是直接指定打包在一起的依赖库的路径?
我记得gcc的编译选项里面有-rpath之类的option,不知道是不是也能起到指定运行路径的作用(我试过,但没成功,不知道是理解错误还是什么地方没给对)
【 在 try 的大作中提到: 】
: 用 ld-linux 起程序试试看?
: 把依赖库都打包一起。
:
--
FROM 116.4.11.*
多谢!一年前的问题了,那时候没有解决,忙别的去了。
现在记录一下用法:
ld-xxx.so --library-path PATH binary options
我之前好像把 --library-path PATH 放在最后了,结果不行。
【 在 try 的大作中提到: 】
: 是的。就是用 ld-linux 来控制各类加载库的路径。
:
--
FROM 14.16.76.*