gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:08:46 25 4
gpt4 key购买 nike

在我工作的基于 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 -lncurses -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 -lncurses -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。

就其值(value)而言,在基于 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 以使新链接器工作?

最佳答案

您的 libncurses 库本身链接到 libtinfo,这会导致您的旧工具链也在 libtinfo 中查找符号。

但较新的工具链通常使用 --as-needed--no-copy-dt-needed-entries 运行链接器,后者可能导致您所看到的差异。

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

gcc main.c -lncurses -ltinfo

关于c - gcc 4.8.2/ld 2.24 链接失败,gcc 4.4.7/ld 2.20 链接成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26267788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com