loongson/build-tools

动态链接出现问题?

Closed this issue · 4 comments

我们使用 loongarch64-clfs-2022-03-03-cross-tools-gcc_and_clang-full.tar.xz 工具链,在 Debian Linux x86_64 上编译以下源代码:

#include <stdio.h>
int main(void) {
        printf("Hello LoongArch!\n");
        return 0;
}

使用的编译指令为:

clang --target=loongarch64-unknown-linux-gnu hw.c -o hw

由于 Debian 上没有安装过 LLVM,所以可以确定使用的就是工具链的 clang。

将编译生成的二进制文件上传到 Loongnix-Server Linux 8 loongarch64 的机器上无法运行,提示:

-bash: ./hw: No such file or directory


再使用

clang --target=loongarch64-unknown-linux-gnu hw.c -static -o hw

在同样的龙芯机器上可以正常运行,故怀疑动态链接存在问题?

CLFS工具链的.interp是"/lib64/ld-linux-loongarch-lp64d.so.1",Loongnix-Server可能无该文件,创建软链接试试?

CLFS工具链的.interp是"/lib64/ld-linux-loongarch-lp64d.so.1",Loongnix-Server可能无该文件,创建软链接试试?

我们尝试使用 sudo ln -s /lib64/ld.so.1 /lib64/ld-linux-loongarch-lp64d.so.1 创建了软链接,运行时报错:

./hw: /lib64/libc.so.6: version GLIBC_2.36' not found (required by ./hw)`

感觉是工具链的 GLIBC 版本太高了,但是我们已经将 Loongnix 上的 GLIBC 用 yum 升级到最新版本了。所以我们考虑:

  • 手动把 loongnix 上的 GLIBC 升到最新版本
  • 使用旧版本的工具链(但我们不确定旧版本的工具链是否有足够低版本的 GLIBC ?)

对于这种情况,有没有推荐的解决方案呢?

CLFS工具链的.interp是"/lib64/ld-linux-loongarch-lp64d.so.1",Loongnix-Server可能无该文件,创建软链接试试?

我们尝试使用 sudo ln -s /lib64/ld.so.1 /lib64/ld-linux-loongarch-lp64d.so.1 创建了软链接,运行时报错:

./hw: /lib64/libc.so.6: version GLIBC_2.36' not found (required by ./hw)`

感觉是工具链的 GLIBC 版本太高了,但是我们已经将 Loongnix 上的 GLIBC 用 yum 升级到最新版本了。所以我们考虑:

  • 手动把 loongnix 上的 GLIBC 升到最新版本
  • 使用旧版本的工具链(但我们不确定旧版本的工具链是否有足够低版本的 GLIBC ?)

对于这种情况,有没有推荐的解决方案呢?

我想您是需要一个能进行交叉编译的工具链。但实际上Loongnix的ABI与CLFS的ABI并不一致(大佬们区分为新世界或旧世界,我的理解是,进入社区的ABI为新世界,在Loongnix的为旧世界)。
您尝试了CLFS工具链出现了interp的问题就是新旧ABI导致的问题,但是我未找到旧世界的工具链。
如果想使用旧ABI工具链,我并没有好的解决方案。
如果想了解CLFS,可以参考 https://github.com/sunhaiyong1978/CLFS-for-LoongArch/
当然,如果只是简单的编译一些文件并验证(不使用到太多库的话),可以交叉编译后,制作CLFS,并上传到CLFS上运行。

CLFS工具链的.interp是"/lib64/ld-linux-loongarch-lp64d.so.1",Loongnix-Server可能无该文件,创建软链接试试?

我们尝试使用 sudo ln -s /lib64/ld.so.1 /lib64/ld-linux-loongarch-lp64d.so.1 创建了软链接,运行时报错:
./hw: /lib64/libc.so.6: version GLIBC_2.36' not found (required by ./hw)`
感觉是工具链的 GLIBC 版本太高了,但是我们已经将 Loongnix 上的 GLIBC 用 yum 升级到最新版本了。所以我们考虑:

  • 手动把 loongnix 上的 GLIBC 升到最新版本
  • 使用旧版本的工具链(但我们不确定旧版本的工具链是否有足够低版本的 GLIBC ?)

对于这种情况,有没有推荐的解决方案呢?

我想您是需要一个能进行交叉编译的工具链。但实际上Loongnix的ABI与CLFS的ABI并不一致(大佬们区分为新世界或旧世界,我的理解是,进入社区的ABI为新世界,在Loongnix的为旧世界)。 您尝试了CLFS工具链出现了interp的问题就是新旧ABI导致的问题,但是我未找到旧世界的工具链。 如果想使用旧ABI工具链,我并没有好的解决方案。 如果想了解CLFS,可以参考 https://github.com/sunhaiyong1978/CLFS-for-LoongArch/ 当然,如果只是简单的编译一些文件并验证(不使用到太多库的话),可以交叉编译后,制作CLFS,并上传到CLFS上运行。

感谢您的解答!