首页 > 解决方案 > 使用 -O3 -flto 编译 glibc 因节类型冲突而失败

问题描述

我正在为 AArch64 引导 Linux。

glibc 2.33 无法使用-O3 -flto. 配置由

../glibc-2.33/configure --prefix=/usr --build=x86_64-linux-gnu --host=aarch64-linux-gnu --enable-kernel=5.12.3 --with-headers=/target/usr/include CFLAGS="-O3 -flto" CXXFLAGS="-O3 -flto" LDFLAGS="-O3 -flto" libc_cv_slibdir=/usr/lib

并在编译期间给出错误

aarch64-linux-gnu-gcc ../sysdeps/unix/sysv/linux/aarch64/libc-start.c -c -std=gnu11 -fgnu89-inline  -O3 -flto -Wall -Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math -fno-stack-protector -Wstrict-prototypes -Wold-style-definition -fmath-errno   -fPIC -fno-stack-protector -DSTACK_PROTECTOR_LEVEL=0 -funwind-tables  -ftls-model=initial-exec      -I../include -I/cross/build/csu  -I/cross/build  -I../sysdeps/unix/sysv/linux/aarch64  -I../sysdeps/aarch64/nptl  -I../sysdeps/unix/sysv/linux/generic  -I../sysdeps/unix/sysv/linux/wordsize-64  -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  -I../sysdeps/posix  -I../sysdeps/aarch64/fpu  -I../sysdeps/aarch64/multiarch  -I../sysdeps/aarch64  -I../sysdeps/wordsize-64  -I../sysdeps/ieee754/ldbl-128  -I../sysdeps/ieee754/dbl-64  -I../sysdeps/ieee754/flt-32  -I../sysdeps/ieee754  -I../sysdeps/generic  -I.. -I../libio -I. -nostdinc -isystem /cross/local/lib/gcc/aarch64-linux-gnu/11.1.0/include -isystem /cross/local/lib/gcc/aarch64-linux-gnu/11.1.0/include-fixed -isystem /cross/target/usr/include -D_LIBC_REENTRANT -include /cross/build/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h  -DPIC -DSHARED     -DTOP_NAMESPACE=glibc -o /cross/build/csu/libc-start.os -MD -MP -MF /cross/build/csu/libc-start.os.dt -MT /cross/build/csu/libc-start.os
In file included from ../sysdeps/aarch64/nptl/tls.h:37,
                 from ../include/link.h:51,
                 from ../include/dlfcn.h:4,
                 from ../sysdeps/generic/ldsodefs.h:32,
                 from ../sysdeps/aarch64/ldsodefs.h:47,
                 from ../sysdeps/gnu/ldsodefs.h:46,
                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
                 from ../sysdeps/unix/sysv/linux/aarch64/ldsodefs.h:23,
                 from ../csu/libc-start.c:26,
                 from ../sysdeps/unix/sysv/linux/aarch64/libc-start.c:33:
../sysdeps/unix/sysv/linux/aarch64/sysdep.h:280:18: error: '__pointer_chk_guard' causes a section type conflict with '_rtld_global_ro'
  280 | extern uintptr_t __pointer_chk_guard attribute_relro;
      |                  ^~~~~~~~~~~~~~~~~~~
In file included from ../sysdeps/aarch64/ldsodefs.h:47,
                 from ../sysdeps/gnu/ldsodefs.h:46,
                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
                 from ../sysdeps/unix/sysv/linux/aarch64/ldsodefs.h:23,
                 from ../csu/libc-start.c:26,
                 from ../sysdeps/unix/sysv/linux/aarch64/libc-start.c:33:
../sysdeps/generic/ldsodefs.h:678:36: note: '_rtld_global_ro' was declared here
  678 | extern const struct rtld_global_ro _rtld_global_ro
      |                                    ^~~~~~~~~~~~~~~
make[2]: *** [/cross/build/sysd-rules:25: /cross/build/csu/libc-start.os] Error 1
make[2]: Leaving directory '/cross/sources/glibc-2.33/csu'
make[1]: *** [Makefile:479: csu/subdir_lib] Error 2
make[1]: Leaving directory '/cross/sources/glibc-2.33'
make: *** [Makefile:9: all] Error 2

交叉编译的 GCC 是由

../gcc-11.1.0/configure --prefix=/opt/cross --with-sysroot=/target --build=x86_64-linux-gnu --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-nls --disable-threads --disable-shared --without-headers --with-newlib --with-glibc-version=2.33 CFLAGS_FOR_TARGET="-O3 -flto" CXXFLAGS_FOR_TARGET="-O3 -flto" LDFLAGS_FOR_TARGET="-O3 -flto"
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc

我做了一些初步调查,发现 glibc 的作者在有问题的标头中放置了一些技巧,sysdeps/generic/ldsodefs.h以使其_rtld_global_ro在动态链接时可修改,const否则。我认为这些技巧不是严格符合标准的,但是如果我删除所有-O3 -flto东西,它们编译没有问题,如果我添加这些标志,则会产生上述错误。

我想知道:

标签: linuxgcccross-compilingglibc

解决方案


推荐阅读