2013-02-24 37 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