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

2024-03-08

SWIG 在 AIX 上可以轻松编译和安装。不幸的是,一个简单的SWIG 你好世界 http://www.swig.org/tutorial.html(也可以编译 - 但不是那么容易)因分段错误或非法指令而崩溃(取决于编译/链接器过程的一些细节)。 gcc 和 xlc(IBM c 编译器)都会发生这种情况。我只尝试了本机 AIX 链接器 ld,因为我的系统上没有安装同音 GNU ld。

文件:示例.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);
 }

文件:示例.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();

生成文件片段:

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 http://www.swig.org/tutorial.html, 你应该做

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

做自己该做的事应该做的 http://en.wikipedia.org/wiki/RTFM,很明显,解决方案是使用各种链接器选项进行黑客攻击,-berok, -bnoentry, -bexpall, -brtl, -bshared, -bM:SRE, -bexpfull。事实上,可以找到一些组合来创建非空的 .so 库,而不会产生错误。上面的 Makefile 片段中报告了其中一种组合(还有其他组合)。不幸的是,它们都在以下两种模式之一中失败了!

$ python -c "import example"
Illegal instruction (core dumped)

or

$ python -c "import example"
Segmentation fault (core dumped)

使用 gcc 或不同版本的 python(我们有 7 个!),无论是 32 位还是 64 位都不会改变任何内容:您可以找到一个“好的”链接选项,但它在运行时崩溃。怎么解决这个问题呢?


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

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var("LINKFORSHARED")
'-Wl,-bE:Modules/python.exp -lld'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐