2013-02-24 17 views
0

系统:我在i32芯片组上运行32位Ubuntu 12.04。在32位环境中链接到32位共享目标文件会生成ELFCLASS64错误

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

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

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

然而,当我建立在64位环境,并链接到他们的塞库在64位环境中我的应用程序运行完美。所以,我想我为64位环境构建.so文件,然后编辑用于构建库的CMakeLists.txt文件。除了cuda(其依赖于slug)位标志之外,我还添加了许多32位编译和链接标志,共享对象模块标志。无论我尝试使用哪种标志组合,生成的库在运行我的应用程序可执行文件时都会导致错误。所以我决定在每个共享目标文件上运行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 
    } 

回答

2

此错误消息:

error while loading shared libraries: libslugSpec.so: wrong ELF class: 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在“系统”之前选择您的版本),并且问题将被解决。

+0

你完全正确!我必须将以前版本的libSlugSpec安装到/ usr/lib中。非常感谢! – 2013-02-25 00:41:34

相关问题