【问题标题】:SWIG crashes on AIX (with python, and probably everything else SWIG support)SWIG 在 AIX 上崩溃(使用 python,可能还有其他所有 SWIG 支持)
【发布时间】:2010-12-16 15:38:43
【问题描述】:

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 sn-p:

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、@ 987654335@。事实上,可以找到一些组合来创建非空的 .so 库,而不会产生错误。上面的 Makefile sn-p 报告了其中一种组合(还有其他组合)。不幸的是,它们都在以下两种模式之一中失败!

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

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

使用 gcc 或不同版本的 python(我们有 7 个!) 32 位或 64 位不会改变任何东西:您可以找到一个“好的”链接选项,但它在运行时崩溃。如何解决?

【问题讨论】:

    标签: swig aix


    【解决方案1】:

    这篇文章并没有直接帮助我,但再次为我指明了正确的方向——但情况不同,我正在构建一个嵌入式 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'
    

    【讨论】:

      【解决方案2】:

      这不是一个实际问题,而是关于我如何解决我的问题的报告(请参阅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
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 2016-09-01
        • 1970-01-01
        • 2012-03-20
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        相关资源
        最近更新 更多