gcc 4.8.2 / ld 2.24的链接失败,gcc 4.4.7 / ld 2.20的链接成功

在我基于CentOS 6.4的chroot中,与ld 2.20的ncurses链接成功,但是与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链接的最小示例.

#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 -inccurses -Wl,-verbose | grep“ ncurses.*成功”
尝试打开/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libncurses.so成功
$

失败(ld 2.24):

$/opt/gcc/4.8.2/bin/gcc48 main.c -inccurses -Wl,-verbose | grep“ ncurses.*成功”
尝试打开/usr/lib/../lib64/libncurses.so成功
/opt/binutils/2.24/bin/ld24:/tmp/ccCxUFxl.o:对符号’halfdelay’的未定义引用
/lib64/libtinfo.so.5:添加符号时出错:命令行缺少DSO
collect2:错误:ld返回1退出状态
$

请注意,这两个命令似乎都链接到相同的libncurses.so.

就其价值而言,在基于CentOS 5.4的其他chroot中,存在不同的libncurses版本,并且它与ld 2.24可以很好地链接,但是不幸的是,在该chroot中进行构建不是一个选择. nm实用程序显示此处的(静态)libncurses.a确实具有必需的符号(nm并未为libncurses.so列出任何符号-因此,我只是假设它们是相似的).

但是,在CentOS 6.4 chroot中,nm表示我正在获取“未定义的参考”消息的所有ncurses符号确实是未定义的,或者在libncurses.a中不存在.在Centos 6.4 chroot中,这很混乱,因为与gcc链接4.4.7工作.有点不对劲.

另外,我尝试使用gcc 4.4.7生成对象,然后与gcc 4.8.2链接,但这无济于事.

对于一个编译器/链接器为什么会成功而另一个编译器/链接器为什么会失败,我感到困惑.这是ABI问题吗?有人知道这里发生了什么吗?我可以传递给gcc的任何标志来使新的链接器工作吗?

解决方法:

您的libncurses库本身已链接到libtinfo,这会使您的旧工具链也在libtinfo中查找符号.

但是,较新的工具链通常按需要和–no-copy-dt-needed-entries运行链接器,后者可能会引起您所看到的差异.

基本上,您还需要链接到libtinfo,这是halfdelay函数所在的位置.

gcc main.c -lncurses -ltinfo
上一篇:使用NDK进行交叉编译,对le32toh和be32toh的未定义引用


下一篇:linux-无法识别共享库文件格式