linux - 使用 -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
东西,它们编译没有问题,如果我添加这些标志,则会产生上述错误。
我想知道:
- 有没有人成功地用 引导 glibc
-O3 -flto
?这样做的正确方法是什么? - 或者,它是否被视为不受支持的场景并且不应尝试?
解决方案
推荐阅读
- c++ - 使用指针显示数组的值
- python - 将 mss 屏幕截图转换为 pil 图像
- azure-blob-storage - 从逻辑应用读取 blob 内容
- java - 使用 Jackson ObjectMapper 抛出 OutOfMemoryError
- sql-injection - 从 POST 到 GET 的转换
- reactjs - reactjs给出错误模块未找到
- javascript - 带有特定字符串和之后任意数量的字符的正则表达式
- angular - 如何以角度删除动态生成的类名
- wordpress - 如何在 TYPO3 网站的导航栏中集成 Wordpress 博客
- linux - 链接器如何将程序头添加到可重定位文件?