在RHEL 5.11上编译glibc-2.22出现CFI指令错误求助
在RHEL 5.11上用GCC 5.2.0编译glibc 2.22时出现CFI指令错误的排查方向
我正在将某软件移植到RHEL 5.11系统,该软件要求glibc版本高于2.11。使用gcc 5.2.0编译glibc 2.22时,遇到如下编译错误:
gcc iconv_close.c -c -std=gnu99 -fgnu89-inline -O3 -Wall -Werror -Wno-error -Wno-error=undef -Wundef -Wwrite-strings -fmerge-all-constants -frounding-math -g -Wstrict-prototypes -fPIC -ftls-model=initial-exec -I../include -I/root/river/22102022/glibc-2.22/build/iconv -I/root/river/22102022/glibc-2.22/build -I../sysdeps/unix/sysv/linux/x86_64/64 -I../sysdeps/unix/sysv/linux/x86_64 -I../sysdeps/unix/sysv/linux/x86 -I../sysdeps/unix/sysv/linux/wordsize-64 -I../sysdeps/x86_64/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/x86_64 -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/x86_64/64 -I../sysdeps/x86_64/fpu/multiarch -I../sysdeps/x86_64/fpu -I../sysdeps/x86/fpu/include -I../sysdeps/x86/fpu -I../sysdeps/x86_64/multiarch -I../sysdeps/x86_64 -I../sysdeps/x86 -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64/wordsize-64 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/wordsize-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -D_LIBC_REENTRANT -include /root/river/22102022/glibc-2.22/build/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h -DPIC -DSHARED -o /root/river/22102022/glibc-2.22/build/iconv/iconv_close.os -MD -MP -MF /root/river/22102022/glibc-2.22/build/iconv/iconv_close.os.dt -MT /root/river/22102022/glibc-2.22/build/iconv/iconv_close.os make[2]: *** [/root/river/22102022/glibc-2.22/build/iconv/gconv_conf.o] Error 1 make[2]: *** Waiting for unfinished jobs.... gconv_db.c: Assembler messages: gconv_db.c:737: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:740: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:743: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:746: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:777: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:780: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:750: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:753: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:769: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:772: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:797: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:800: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:811: Error: CFI instruction used without previous .cfi_startproc gconv_db.c:814: Error: CFI instruction used without previous .cfi_startproc
以下是针对该问题的排查方向:
- 检查汇编器版本:RHEL 5.11默认的binutils版本过旧,无法处理GCC 5.2.0生成的CFI(调用帧信息)指令。CFI需要binutils 2.21或更高版本支持,RHEL 5.11自带版本通常不满足。执行
as --version查看当前版本,若版本过低,手动编译安装较新的binutils(如2.25+),并确保编译glibc时优先使用新工具。 - 调整GCC编译选项:尝试禁用生成CFI指令的相关选项,比如去掉
-g调试参数,或添加-fno-asynchronous-unwind-tables选项(禁用异步 unwind 表)。可以在glibc的configure阶段通过CFLAGS="-fno-asynchronous-unwind-tables"传递参数,或修改Makefile中的编译选项。 - 降低glibc版本尝试:glibc 2.22对旧系统兼容性较差,尝试选择更低版本的glibc(如2.12、2.17),这些版本对RHEL 5.11的适配性更好,可能不会触发该CFI指令问题。
- 确认编译环境变量:确保
PATH、LD_LIBRARY_PATH等环境变量指向新安装的GCC和binutils,避免系统默认旧工具干扰。例如通过export PATH=/path/to/new/binutils/bin:$PATH让新汇编器优先被调用。 - 查找glibc适配补丁:社区中已有用户在旧系统编译高版本glibc时遇到类似问题,可查找针对RHEL 5.x编译glibc 2.22的补丁,修复CFI相关的编译逻辑问题。
内容的提问来源于stack exchange,提问作者Som
相关产品推荐
相关产品推荐

