Clang编译成sysroot与较新的glibc



我正在尝试用Ubuntu 22.04的系统根从Ubuntu 20.04映像编译,并且我遇到了相当多的麻烦,得到链接器错误如下:

/usr/bin/ld: ../build_rootfs/x86_64_jammy/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_dl_audit_symbind_alt@GLIBC_PRIVATE'
/usr/bin/ld: ../build_rootfs/x86_64_jammy/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_dl_audit_preinit@GLIBC_PRIVATE'
/usr/bin/ld: ../build_rootfs/x86_64_jammy/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `_dl_fatal_printf@GLIBC_PRIVATE'
/usr/bin/ld: ../build_rootfs/x86_64_jammy/lib/x86_64-linux-gnu/libc.so.6: undefined reference to `__nptl_change_stack_perm@GLIBC_PRIVATE'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

完全相同的调用在Ubuntu 22.04上工作得很好,使用完全相同的编译器和完全相同的系统根。

这是我的设置:

// test.cpp
int main(){}

编译命令:

clang++ --sysroot ../build_rootfs/x86_64_jammy test.cpp

其中../build_rootfs/x86_64_jammy是用multistrap创建的sysroot(如果相关,我可以共享最小化的multistrap配置,但考虑到相同的sysroot在Ubuntu 22.04中工作得很好,sysroot似乎不是问题。

我尝试过的事情:

  • 使用lld—结果相同
  • 使用clang 14,从apt.llvm.org和二进制tarball

值得注意的是,GCC能够通过传递-L/usr/lib/x86_64-linux-gnu/9 -L/usr/lib/x86_64-linux-gnu来编译它(是的,即使在使用--sysroot编译时也是如此),但这看起来很奇怪,因为这是链接到主机系统上的库。添加这些标志确实会让编译成功,但在22.04上从clang编译可以正常工作,而不需要加载任何系统库(据称)。

我认为这是glibc版本的问题,但是我看不出主机glibc版本在从系统根编译时是如何起作用的,而且似乎没有任何链接器输入实际上来自主机系统,所以出了什么问题?

这个要点有clang on focal、gcc on focal和clang on jam的详细日志供参考。

终于发现我做错了什么-$rootfs/lib64/ld-linux-x86-64.so.2是一个符号链接到/lib/x86_64-linux-gnu/ld-2.31.so,所以固定它是一个相对的而不是绝对的符号链接固定它。

最新更新