代码之家  ›  专栏  ›  技术社区  ›  Davide

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

  •  2
  • Davide  · 技术社区  · 15 年前

    swig可以在AIX上轻松编译和安装。不幸的是,一个简单的 SWIG hello world (它也编译-但不太容易)由于分段错误或非法指令(取决于编译/链接器进程的某些细节)而崩溃。GCC和XLC(IBMC编译器)都会发生这种情况。我只尝试了本机AIX链接器ld,因为我的系统上没有安装同名GNUld。

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

    文件:示例

    %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 你应该这么做

    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和开源社区对于“共享库”的含义有着完全不同的看法。从AIXNativeLinker获得的最常见的共享对象(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位都不会改变任何东西:您可以找到一个“好”的链接选项,但它会在运行时崩溃。如何解决这个问题?

    2 回复  |  直到 14 年前
        1
  •  1
  •   shikhar    14 年前

    这篇文章没有直接帮助我,但是再次指出了正确的方向——但是情况不同,我正在构建一个嵌入式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
  •  0
  •   Community Nick Bolton    7 年前

    这不是一个实际的问题,而是一份关于我如何解决问题的报告(参见 here 为什么我要这么做)。实际上我自己也没能解决,但这要感谢 this other guy . 我在这里重写,因为他太具体了(AIX 5.1与Perl和C++,我偶然发现他,而我正在寻找其他东西!我在找这个问题的时候根本找不到他的答案!我希望这篇文章能让别人更容易找到! 我的问题出在使用python和c的AIX5.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
    

    希望这有帮助!