encabezado elfo inválido linux

He portado un código c++ de un sistema operativo solaris abierto a un sistema operativo Redhat 4. En este fragmento de código, estoy recibiendo un error:

    AsciiFileName = new char [1024];
    cout<<"HandleFile is getting called "<<endl;
    /// Converting the file name to ascii.
    FileName += strFileName;
    FileName.ConvertToAscii( AsciiFileName );

    /// Get handle to the shared object file.
    Handle = dlopen( AsciiFileName, RTLD_LOCAL | RTLD_LAZY );
    cout<<"Handle = dlopen( AsciiFileName, RTLD_LOCAL | RTLD_LAZY ); is getting called AsciiFileName"<<AsciiFileName<<endl;
    if (!Handle)
    {
    cout<<"Handle is NULL"<<endl;
    cout<<dlerror()<<endl;
exit(EXIT_FAILURE);

El error que recibo es:

invalid elf header linux

No es capaz de abrir el archivo so. Aquí está el registro relevante para ello

Before ProcessSharedObject->IterateOnDir
 GCVDirectoryIterator::IterateOnDir:file name :/bin/ls /trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/*.so
 GCVDirectoryIterator::IterateOnDir:file opened  :/trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/libGCVCore.so

before GCVDirectoryIterator::AddFile
HandleFile is getting called
Handle = dlopen( AsciiFileName, RTLD_LOCAL | RTLD_LAZY ); is getting called AsciiFileName/trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/libGCVCore.so
Handle is NULL
/trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/libGCVCore.so: invalid ELF header

preguntado el 04 de julio de 12 a las 10:07

¿Estás tratando de abrir un solaris .so? -

2 Respuestas

/trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/libGCVCore.so: archivo ar actual

Esa es una biblioteca estática (archivo), y debería ser .ano, .so. No puedes abrirlo con dlopen.

Respondido 04 Jul 12, 17:07

Esto es correcto. Vi que durante la compilación se muestra " ADD_LIBRARY para la biblioteca GenericUSMModules se usa con la opción SHARED, pero la plataforma de destino solo admite bibliotecas STATIC. Compilándola STATIC en su lugar. Esto puede generar problemas. ". Gracias por la ayuda: subodh1989

Probablemente copió libGCVCore.so de una máquina Solaris a una máquina RedHat. Lo más probable es que la máquina Solaris tenga una arquitectura diferente (¿Sparc?) a la de RedHat. Puede obtener una confirmación escribiendo:

file libGCVCore.so

Este comando debe imprimir información sobre la arquitectura de destino de la biblioteca que está intentando vincular.

Respondido 04 Jul 12, 11:07

No, todas las bibliotecas requeridas se crean aquí durante el tiempo de compilación. Esas no se copian. - subodh1989

este comando muestra:/trnuser1/rmtrain/DevelopmentEnv/Telstra/USM/dat/CnEModules/libGCVCore.so: archivo ar actual - subodh1989

Eso es un poco extraño, la salida debería indicar que el archivo es un objeto compartido, vinculado dinámicamente y la arquitectura de destino (por ejemplo, x86-64) - Sdra

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.