链接到32位环境中的32位共享对象文件会生成ELFCLASS64错误

时间:2013-02-24 22:35:03

标签: c++ linux qt linker intel

系统:我在i32芯片组上运行32位Ubuntu 12.04。

构建信息:我正在使用Qt 4.8.1和GCC的C ++ 11。

问题:我正在开发一个项目,该项目依赖于以下提到的内部开发库作为 slug 。这些库通过传统的“cmake”内置到.so文件中。然后“全力以赴”的过程。从cmake生成.so文件之后,我将.so文件复制到项目的子目录中,这样我就可以在将它们安装到/ usr / lib之前测试它们是否正常工作。然后我提供Qt(在我的.pro文件中),其中包含每个库的绝对路径并构建我的应用程序。我的应用程序找到这些本地库并编译而没有错误或警告。但是,当我运行我的应用程序(通过命令行)时,我收到以下错误:

    error while loading shared libraries: libslugSpec.so: wrong ELF class: ELFCLASS64

但是,当我在64位环境中构建slug库并在64位环境中链接到它们时,我的应用程序运行完美。所以,我想我为64位环境构建了.so文件,然后继续编辑用于构建库的CMakeLists.txt文件。我添加了许多32位编译和链接标志,共享对象模块标志,以及cuda(slug依赖于)位数标志。无论我尝试过哪种标志组合,生成的库在运行我的应用程序可执行文件时都会导致错误。所以我决定在每个共享对象文件上运行 readelf -h 命令,并检查它们是否真的是64位。我发现其中没有一个实际上都生成类似于以下内容的日志:(输出3个.so文件中的一个)

readelf -h libslugSpec.so 
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              DYN (Shared object file)
Machine:                           Intel 80386
Version:                           0x1
Entry point address:               0x10150
Start of program headers:          52 (bytes into file)
Start of section headers:          511960 (bytes into file)
Flags:                             0x0
Size of this header:               52 (bytes)
Size of program headers:           32 (bytes)
Number of program headers:         7
Size of section headers:           40 (bytes)
Number of section headers:         38
Section header string table index: 35

所以现在我完全不知所措,似乎无法在任何地方找到答案。对如何发生这种情况的任何启示都将是一个巨大的帮助。

作为参考,以下是我在构建应用程序的qt .pro文件中提供的标志:

    QMAKE_CXXFLAGS += "-std=gnu++0x"

    QT  += core gui opengl
    TARGET = source
    TEMPLATE = app
    CONFIG+= wwwidgets


    #linux specific settings
    unix:!macx{
        LIBS +=  -lGLEW -lGLU  /home/alex/Dropbox/brain-viz/source/lib/libslugUtil.so /home/alex/Dropbox/brain-viz/source/lib/libslugSpec.so /home/alex/Dropbox/brain-viz/source/lib/libslugSim.so
    }

    #windows specific settings
    win32{
       LIBS += -lglew32 -lwwwidgets4d
    }

1 个答案:

答案 0 :(得分:2)

此错误消息:

  加载共享库时出现

错误:libslugSpec.so:错误的ELF类:ELFCLASS64

与此输出一致:

readelf -h libslugSpec.so 
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF32

结论:您从libslugSpec.so上运行的readelf -h加载不同版本的libslugSpec.so

通过执行以下操作找出在运行时加载 LD_DEBUG=files,libs /path/to/your/executable

readelf -h

然后在 库上运行ELF64,并确认它实际上是LD_LIBRARY_PATH

最后将其替换为您构建的版本(或设置{{1}}以在“系统”之前选择您的版本),问题将得到解决。