2014-10-08 100 views
3

在基於CentOS 6.4的chroot中,我正在工作,鏈接ncurses與ld 2.20成功,但鏈接ld 2.24失敗。我不直接調用鏈接器,gcc正在處理它 - gcc 4.4.7使用ld 2.20,而gcc 4.8.2使用ld 2.24。鏈接失敗與gcc 4.8.2/ld 2.24,成功與gcc 4.4.7/ld 2.20

這是一個最小的例子,它無法在我的特定環境中與gcc 4.8.2/ld 2.24鏈接。

#include <ncurses.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    WINDOW* window = NULL; 

    if (!(window = initscr())) { 
     printf("Error initializing ncurses."); 
     exit(1); 
    } 

    halfdelay(50); 
    getch(); 
    endwin(); 
} 

成功(LD 2.20):

$ gcc main.c -lncurses -Wl,--verbose | grep "ncurses.*succeeded" attempt to open /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libncurses.so succeeded $

故障(LD 2.24):

$ /opt/gcc/4.8.2/bin/gcc48 main.c -lncurses -Wl,--verbose | grep "ncurses.*succeeded" attempt to open /usr/lib/../lib64/libncurses.so succeeded /opt/binutils/2.24/bin/ld24: /tmp/ccCxUFxl.o: undefined reference to symbol 'halfdelay' /lib64/libtinfo.so.5: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status $

注意,這兩個命令似乎對鏈接相同的libncurses.so。

對於它的價值,在基於CentOS 5.4的不同chroot中,有一個不同的libncurses版本,它與ld 2.24很好地鏈接,但不幸的是,在chroot中構建不是一個選項。 nm實用程序顯示(靜態)libncurses.a在這裏確實具有所需的符號(nm列表中沒有libncurses.so的符號 - 所以我只是假設它們是相似的)。

但是,在CentOS 6.4 chroot中,nm顯示我得到的「未定義引用」消息的所有ncurses符號確實未定義,或者在Centos 6.4 chroot的libncurses.a中不存在,因爲與gcc 4.4.7連接起作用。有些事情是不對的。

另外,我試着用gcc 4.4.7生成一個對象,然後用gcc 4.8.2鏈接,但是沒有幫助。

我很困惑,爲什麼一個編譯器/鏈接器會成功,而另一個會失敗。這是ABI問題嗎?有人知道這裏發生了什麼嗎?有沒有任何標誌可以傳遞給gcc來使新的鏈接器工作?

+0

@FaroukJouti,這將是錯誤的,所以沒有理由嘗試它!圖書館追蹤需要它們的文件。 – 2014-10-08 23:03:37

+0

我試過完全一樣的東西,你嘗試過,它在gcc中工作得很好4.8.2 – 2014-10-08 23:16:53

回答

3

您的libncurses庫本身鏈接到libtinfo,這會導致您較舊的工具鏈也在libtinfo中查找符號。

但較新的工具鏈通常運行鏈接器--as-needed--no-copy-dt-needed-entries,後者可能會導致您所看到的差異。

基本上你還需要鏈接到libtinfo,這也是halfdelay函數所在的地方。

gcc main.c -lncurses -ltinfo 
+0

讓我重申一下,檢查我的理解。如果僅將--as-needed標誌傳遞給鏈接器,並且我的示例程序使用libtinfo中的符號,但不使用libncurses,則-lncurses和隱式-ltinfo一起被刪除,因爲不需要libncurses中的符號。這會給libtinfo中的所需符號提供未定義的引用。但是,我的程序使用了libtinfo和libncurses中的符號,所以 - 需要的並沒有傷害到我。但--no-copy-dt-needed-entries阻止了-lncurses從-ltinfo中提取,並且因爲我使用了來自libtinfo的符號,所以我得到了未定義的引用。 – tgnottingham 2014-10-09 00:32:18

+0

據推測,Farouk能夠鏈接的原因不是因爲他的工具鏈沒有將這些標誌傳遞給鏈接器,就是因爲他的libncurses版本包含了所有必需的符號。 – tgnottingham 2014-10-09 00:34:08