SWIG在AIX上崩溃(使用python,可能还有其他所有SWIG支持)

SWIG在AIX上轻松编译和安装。不幸的是,一个简单的SWIG hello world(它也编译 - 但不是那么容易)崩溃与分段错误或非法指令(取决于编译/链接器进程的一些细节)。 gcc和xlc(IBM c编译器)都会发生这种情况。我只尝试了本机AIX链接器ld,因为我的系统上没有安装同音词GNU ld。 文件:example.c

 #include <time.h>
 double My_variable = 3.0;
int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }
int my_mod(int x, int y) {
    return (x%y);
 }
char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }
文件:example.i
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
Makefile片段:
swig -python example.i
xlc -q64 -c example.c example_wrap.c -I/your-python-path/include/python2.5/
ld -G -b64 -berok -bnoentry -bexpall -brtl example.o example_wrap.o -o _example.so
链接器步骤是有问题的。如果您按照tutorial上的示例进行操作,则应该这样做
ld -bshared example.o example_wrap.o -o _example.so #the b is not a typo, but a different syntax in AIX vd GNU ld
不幸的是,由于几个原因,这不起作用。我相信IBM/AIX和开源社区对“共享库”的含义有着截然不同的看法。您从AIX本机链接器获得的最常见的共享对象(so)根本没有符号(实际上大小小于1kB)。从链接器获取损坏的输出也很容易(在这种情况下,链接时会出现很长的未解析符号列表,如下所示):
ld: 0711-317 ERROR: Undefined symbol: PyType_Type
做一个是supposed to do,似乎很清楚该解决方案是使用各种链接器选项进行攻击,-berok-bnoentry-bexpall-brtl-bshared-bM:SRE-bexpfull。实际上,可以找到一些创建非空的.so库的组合,而不会产生错误。其中一个组合在上面的Makefile片段中报告(还有其他组合)。不幸的是,所有这些都在以下两种模式之一失败!
$ python -c "import example"
Illegal instruction (core dumped)
要么
$ python -c "import example"
Segmentation fault (core dumped)
使用gcc或不同版本的python(我们有7个!)32位或64位不会改变任何东西:你可以找到一个“好”链接选项,但它在运行时崩溃。怎么解决这个?
已邀请:

mest

赞同来自:

这不是一个实际的问题,而是关于我如何解决问题的报告(请参阅here我为什么要这样做)。实际上我自己无法解决,但感谢this other guy。我在这里重写它,因为他太具体了(带有perl和C++的AIX 5.1,我偶然发现了他,而我正在寻找别的东西!当我在搜索这个时,我根本找不到他的答案问题!我希望这篇文章能让他人更容易找到! 我的问题是在带有python和C的AIX 5.3上。我相信它在AIX上的每个SWIG安装都很常见(因此我没有标记python和C)。我很快就会联系开发人员,以便他们可以首先解决问题。 好吧,修复只是使用不同的链接线,特别是如下:

ld -G -bI:/your-python-path/lib/python2.5/config/python.exp -bnoentry -bexpall -lC -lc -ldl example.o example_wrap.o -o _example.so
关键是exp文件,您应该为自己的语言/安装找到它:
find /your-python-or-perl-or-other-language-path/ -name *exp
希望这可以帮助!

amagni

赞同来自:

这篇文章并没有直接帮助我,但再次指出了我正确的方向 - 但后来情况不同,我正在构建一个嵌入式python。请参阅http://docs.python.org/extending/embedding.html#linking-requirements

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var("LINKFORSHARED")
'-Wl,-bE:Modules/python.exp -lld'

要回复问题请先登录注册