交叉编译ARM架构GLIBC 2.25时`loc1@GLIBC_2.4`错误的解决方法
交叉编译GLIBC 2.25 for ARM架构的符号版本错误解决方法
环境信息
- 目标架构:ARM
- 交叉编译器版本:
arm-linux-gnueabi-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
编译操作步骤
git clone git://sourceware.org/git/glibc.git cd glibc git checkout glibc-2.25 mkdir build cd build export CC=arm-linux-gnueabi-gcc export glibc_install="$(pwd)/install" ../configure --prefix "$glibc_install" --host=arm-linux-gnueabi --disable-werror make
编译错误信息
make[2]: Entering directory '/home/user/Desktop/glibc/misc' arm-linux-gnueabi-gcc regexp.c -c -std=gnu11 -fgnu89-inline -O2 -Wall -Wundef -Wwrite-strings -fmerge-all-constants -fno-stack-protector -frounding-math -g -Wstrict-prototypes -Wold-style-definition -fPIC -ftls-model=initial-exec -U_FORTIFY_SOURCE -I../include -I/home/user/Desktop/glibc/build/misc -I/home/user/Desktop/glibc/build -I../sysdeps/unix/sysv/linux/arm -I../sysdeps/arm/nptl -I../sysdeps/unix/sysv/linux/include -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/arm -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/arm/include -I../sysdeps/arm -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -D_LIBC_REENTRANT -include /home/user/Desktop/glibc/build/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h -DPIC -DSHARED -o /home/user/Desktop/glibc/build/misc/regexp.os -MD -MP -MF /home/user/Desktop/glibc/build/misc/regexp.os.dt -MT /home/user/Desktop/glibc/build/misc/regexp.os /tmp/ccNe3Uva.s: Assembler messages: /tmp/ccNe3Uva.s: Error: `loc1@GLIBC_2.4' can't be versioned to common symbol 'loc1' /tmp/ccNe3Uva.s: Error: `loc2@GLIBC_2.4' can't be versioned to common symbol 'loc2' /tmp/ccNe3Uva.s: Error: `locs@GLIBC_2.4' can't be versioned to common symbol 'locs' make[2]: *** [../o-iterator.mk:9: /home/user/Desktop/glibc/build/misc/regexp.os] Error 1 make[2]: Leaving directory '/home/user/Desktop/glibc/misc' make[1]: *** [Makefile:215: misc/subdir_lib] Error 2 make[1]: Leaving directory '/home/user/Desktop/glibc' make: *** [Makefile:9: all] Error 2
解决方法
该错误源于高版本GCC(9.x)对符号版本的处理更严格,而GLIBC 2.25的代码未适配此变化,可通过以下方式解决:
方法1:添加编译选项强制转换公共符号
在编译阶段添加-fno-common选项,避免编译器将未初始化的全局变量标记为公共符号,从而允许符号版本化:
# 清理原有构建文件后重新配置编译 cd build rm -rf * export CC=arm-linux-gnueabi-gcc export CFLAGS="-fno-common" export glibc_install="$(pwd)/install" ../configure --prefix "$glibc_install" --host=arm-linux-gnueabi --disable-werror make
方法2:使用兼容版本的GCC
GLIBC 2.25官方推荐适配的GCC版本为4.9至6.x区间,可安装对应版本的交叉编译器(如arm-linux-gnueabi-gcc-6),替换当前编译器后重新执行编译流程。
方法3:手动修改GLIBC代码
针对报错的全局变量显式初始化,避免被识别为公共符号:
- 打开
glibc/misc/regexp.c文件 - 找到变量定义行:
修改为:static char *loc1, *loc2, *locs;static char *loc1 = NULL, *loc2 = NULL, *locs = NULL; - 保存文件后重新执行
make
内容的提问来源于stack exchange,提问作者vtable
相关产品推荐
相关产品推荐

