SWIG аварийно завершает работу в AIX (с python и, возможно, с поддержкой SWIG) - PullRequest
2 голосов
/ 14 ноября 2009

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

Шаг компоновщика является проблематичным. Если вы будете следовать примерам учебник , вы должны сделать

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 и Open Source совершенно разные взгляды на то, что означает «разделяемая библиотека». Наиболее распространенные общие объекты (то есть), которые вы получаете от собственного компоновщика AIX, вообще не содержат символов (и на самом деле имеют размер менее 1 КБ). Также довольно просто получить неверный вывод из компоновщика (в таком случае при линковке появляется довольно длинный список неразрешенных символов, таких как следующие):

ld: 0711-317 ERROR: Undefined symbol: PyType_Type

Делая то, что каждый должен делать , кажется очевидным, что решение взломано с различными вариантами компоновщика, -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 ]

1 голос
/ 26 августа 2010

Этот пост не помог мне напрямую, но снова указал мне правильное направление - но тогда ситуация иная, я строю встроенный питон. Смотри http://docs.python.org/extending/embedding.html#linking-requirements

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var("LINKFORSHARED")
'-Wl,-bE:Modules/python.exp -lld'
0 голосов
/ 14 ноября 2009

Это не фактический вопрос, а отчет о том, как я исправил свою проблему (см. здесь , почему я делаю это). И на самом деле я не смог решить это сам, но это было благодаря этому другому парню . Я переписываю это здесь, потому что он был слишком конкретным (AIX 5.1 с perl и C ++, и я нашел его по счастливой случайности, пока искал что-то еще! Я вообще не смог найти его ответ, когда искал это проблема! Я надеюсь, что этот пост будет более доступным для других! Моя проблема в AIX 5.3 с python и C. Я считаю, что она является общей для каждой установки SWIG в AIX (поэтому я не помечал 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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...