最近在折腾AIX5.3,这是一款非常古老的power架构的服务器,目前IBM官方已经不维护,但是仍然在很多银行里跑着比较核心的业务,由于我们的客户大部分是面向银行,少不了要做AIX5.3上的应用软件适配。本文记录在AIX5.3上编译安装Python3时遇到的一些坑。
由于AIX5.3非常古老,基本上很难找得到可以用的Python3安装包,只能通过源码编译的方式进行编译。
在此之前,需要安装好gcc编译器。安装过程不表(坑也比较多,但都是rpm安装,这里就不详细展开了),我安装的gcc版本是4.8.4。
坑1:缺失libm
遇到的第一个问题,就是缺少libm。
libm是链接math.h的库,玩过C/C++的同学一定非常熟悉,这个库理论上是系统自带的,可世事就是这么无常,偏偏是缺了这个基础库。
按照网上说法,这个库是在bos.adt.libm
这个Fileset里面,但是并找不到这个东西,IBM官方倒是提供了下载链接:https://www.ibm.com/support/pages/fileset-information-bosadtlibm, 但是根本下载不了,原因是AIX5.3官方已经停止维护了,所以这个下载链接实际上是放了个寂寞。
好在我手上是有一个AIX5.3的iso镜像的,于是想,既然是基础包,难道不能从这个iso里解压出来吗?
说干就干,可是解压出来的iso文件中,根本找不到任何关于libm的东西,没有libm.a, 也没有bos.adt.libm。
走到这一步,似乎山穷水尽了。但我仍不肯死心,在网上屎里淘沙,历尽千辛万苦,中间的过程不表了,功夫不负有心人,感谢万能的谷歌,终于找到了蛛丝马迹,说bos.adt.libm
在CD1的bos.dat
中, 查了一下,这个文件居然是有的!
于是使用installp -d bos.adt -l
命令看了一下,竟然真的有libm:
终于看到了胜利的曙光了。
接下来就是安装这个bos.adt
了,闲话不多说,安装命令搞起:
bash-4.2# ls
bos.adt bos.adt.data
bash-4.2# installp -d bos.adt -acgXY all
安装过程还算顺利:
检查了一下,确实安装上了:
写个demo验证一下:
#include<stdio.h>
#include<math.h>
int main(void){
printf("2^2 = %f\n", pow(2,2));
return 0;
}
编译运行:
bash-4.2# gcc 1.c -lm
bash-4.2# ./a.out
2^2 = 4.000000
完美解决。
坑2:SEVERE ERROR: Symbol C_BSTAT
继续编译Python之旅。
满以为解决了libm的问题,后面就一马平川了,可接下来马上又报了个错:
具体报错就是:
"ld: 0711-593 SEVERE ERROR: Symbol C_BSTAT (entry 599) in object libpython3.6m.a[getbuildinfo.o]:
The symbol refers to a csect with symbol number 0, which was not
found. The new symbol cannot be associated with a csect and
is being ignored."
对于这个报错,网上的说法是,这是gcc的BUG,可以通过加编译参数解决:
but this bug is a real show stopper, as it stops one building many
bits of Sage. The GNU 'patch' program is one that's affected. That can
be fixed by setting CFLAGS to -g0, but it would be a huge task to
change all of the software to disable debug information, apart from
the fact it would make debugging harder!!
完整链接如下: https://comp.unix.aix.narkive.com/yfW4nvvT/ld-0711-593-severe-error-symbol-c-bstat-anyone-got-a-better-solution。
按这个说法,只需要加上CFLAGS=g0即可解决这个问题,于是修改编译参数:
./configure CC=/usr/bin/gcc --enable-optimizations CFLAGS=-g0
现在终于不报这个错了。
坑3:TOC overflow
可是接下来马上又报了一个错:
这个错误仍然是gcc报出来的,说TOC overflow
。
我们从gcc的官方链接中可以找到关于TOC的相关说明:https://gcc.gnu.org/onlinedocs/gcc/RS_002f6000-and-PowerPC-Options.html
所谓的TOC,就是Table Of Contents
,他会为每个可执行文件生成一个.toc目录,由于Python本身源码比较大,因此生成的toc也就比较大,这就造成了溢出,官方文档还有一段说明:
也就是说,可以通过增加-mminimal-toc
编译选项来解决。
于是,编译Python的编译选项就变成了如下这个样子:
./configure CC=/usr/bin/gcc CFLAGS="-mminimal-toc -g0"
make
make install
至此,安装完成。
设置一下环境变量:
export PATH=$PATH:/usr/local/bin
可以看到,已经能正常运行python3了。
推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习: C/C++Linux服务器开发/高级架构师