TRAGO se estrella en AIX (con Python, y probablemente todo el apoyo TRAGO otra cosa)

StackOverflow https://stackoverflow.com/questions/1735199

  •  20-09-2019
  •  | 
  •  

Pregunta

TRAGO compila e instala fácilmente en AIX. Por desgracia, un simple TRAGO hola mundo (que también compila - pero no tan fácilmente) se bloquea con la segmentación culpa o instrucción ilegal (dependiendo de algunos detalles del proceso de compilación / enlazador). Esto sucede tanto con gcc y xlc (c compilador IBM). He intentado sólo el nativo ld AIX enlazador, debido a que el LD homónimos GNU no se ha instalado en mi sistema.

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

Archivo: 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 fragmento:

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

El paso enlazador es la problemática. Si usted sigue los ejemplos en la tutorial , que debe hacer

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

Por desgracia esto no funciona por varias razones. Creo que IBM / AIX y las comunidades de código abierto tienen bastantes diferentes ideas sobre lo "biblioteca compartida" significa. Los objetos compartidos más comunes (por lo) que se obtiene de la enlazador nativa AIX no tienen símbolos en absoluto en ellos (y, de hecho, menos de 1 kb de tamaño). También es bastante fácil de obtener una salida rota desde el enlazador (en este caso, un bastante larga lista de símbolos sin resolver como la siguiente, mientras que la vinculación):

ld: 0711-317 ERROR: Undefined symbol: PyType_Type

Hacer lo que uno es supone que debe hacer , parece claro que la solución es la piratería con las diversas opciones de enlazador, -berok, -bnoentry, -bexpall, -brtl, -bshared, -bM:SRE, -bexpfull. De hecho, es posible encontrar algunas combinaciones que crean una biblioteca .so no vacía, sin generar errores. Una de estas combinaciones se informa en el fragmento de Makefile anteriormente (hay otros). Por desgracia, todos ellos fallan en uno de los dos modos siguientes!

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

o

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

Uso del gcc, o una versión diferente de pitón (tenemos 7!) O bien 32 bits o 64 bits no cambia nada: se puede encontrar una "buena" opción de enlace, pero se bloquea en tiempo de ejecución. ¿Cómo resolver esto?

¿Fue útil?

Solución 2

Esta no es una pregunta real, sino un informe sobre cómo me fijo mi problema (ver aquí por qué estoy haciendo esto). Y en realidad yo no era capaz de resolver por mí mismo, pero fue gracias a este otro tipo . Estoy reescribiendo aquí, porque era demasiado específico (AIX 5.1 con el Perl y C ++, y lo encontré por casualidad, mientras que yo estaba buscando otra cosa! Yo no era capaz de encontrar su respuesta en absoluto cuando yo estaba buscando para este problema! espero que este post va a ser encontrar con más facilidad a los demás! Mi problema es en AIX 5.3 con Python y C. Creo que es común a todas las instalaciones de TRAGO en AIX (por lo tanto yo no etiquetar Python y C). Me pondré en contacto con los desarrolladores pronto por lo que podrían fijar la ayuda en el primer lugar.

Bueno, la solución es simplemente usar una línea de enlace diferente, en particular, de la siguiente manera:

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

La clave está en el archivo CAD, que debe encontrarse para su idioma / instalación:

find /your-python-or-perl-or-other-language-path/ -name *exp

Espero que esto ayude!

Otros consejos

Este post no me ayuda directamente, pero de nuevo me señaló en la dirección correcta - pero entonces la situación es diferente, estoy construyendo un pitón incrustado. Ver http://docs.python.org/extending/embedding.html#linking -Requisitos

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var("LINKFORSHARED")
'-Wl,-bE:Modules/python.exp -lld'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top