从Ubuntu20升级到22.04后交叉编译失败,求助解决方案
交叉编译升级Ubuntu后出现GLIBC_PRIVATE未定义引用问题
问题场景
在Ubuntu 20.04系统中,使用arm-linux-gnueabihf-g++配合QT Creator中为设备定制编译的Qt 5.12.3工具链进行交叉编译完全正常。但升级到Ubuntu 22.04后出现交叉编译失败,链接器输出如下错误:
/usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '_dl_make_stack_executable@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_dlclose@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__libc_dlopen_mode@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_longjmp@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_dl_error_tsd@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_vfork@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_allocate_rtsig_private@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__clock_getres@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_thread_freeres@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__clock_getcpuclockid@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libdl.so.2: undefined reference to '_dl_addr@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_pthread_init@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_current_sigrtmin_private@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libdl.so.2: undefined reference to '_dl_sym@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__clock_nanosleep@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__libc_dlsym@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libpthread.so.0: undefined reference to '__libc_current_sigrtmax_private@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/libdl.so.2: undefined reference to '_dl_vsym@GLIBC_PRIVATE' /usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: /home/asianirish/img/armbian/lib/arm-linux-gnueabihf/librt.so.1: undefined reference to '__clock_settime@GLIBC_PRIVATE' collect2: error: ld returned 1 exit status
(Sysroot路径:/home/asianirish/img/armbian)
问题原因
这是交叉编译器与sysroot中GLIBC版本不兼容导致的:
- Ubuntu 20.04自带的
arm-linux-gnueabihf-gcc是9.x版本,其依赖的GLIBC内部符号与你sysroot中Armbian系统的GLIBC版本匹配; - 升级到Ubuntu 22.04后,交叉编译器版本升级到11.x,对应的GLIBC内部符号(即报错中的
GLIBC_PRIVATE标记符号)发生了变化,而你sysroot中的GLIBC库版本较低,没有这些新的内部符号,因此链接器无法找到对应的定义,出现未引用错误。
解决方法
方法一:降级交叉编译器版本
安装Ubuntu 20.04(Focal)版本的交叉编译工具链,确保与原sysroot的GLIBC版本兼容:
# 添加Focal版本的Ubuntu源 echo "deb http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee /etc/apt/sources.list.d/focal.list sudo apt update # 安装9.x版本的交叉编译工具 sudo apt install gcc-9-arm-linux-gnueabihf g++-9-arm-linux-gnueabihf # 设置默认使用9.x版本的交叉编译器 sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-9 100 sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-9 100
方法二:更新sysroot中的GLIBC库
替换sysroot(/home/asianirish/img/armbian)内的GLIBC相关库(如libc.so.6、libpthread.so.0等)为与Ubuntu 22.04交叉编译器匹配的版本,或者直接下载对应版本的Armbian系统镜像重新生成sysroot。注意替换时要保证库版本完全兼容,避免运行时出现兼容性问题。
方法三:使用独立交叉工具链
自行编译与Ubuntu 20.04版本一致的交叉工具链,或者使用crosstool-ng构建独立的工具链,与系统自带工具链隔离,保持编译环境与之前完全一致。
内容的提问来源于stack exchange,提问作者asianirish
相关产品推荐
相关产品推荐

