arm - 如果使用了 THUMB,则用于 ARM 目标的 glibc 交叉编译在链接时失败
问题描述
我正在尝试为 arm 家族构建跨 gcc。
我正在使用构建 9.3gcc cross-gcc 的整个多步骤过程可以正常工作并为:i386、x86_64、aarch64 和 ARM 构建工作系统 - 但在 THUMB 案例中的 ARM 中失败。
我用来构建 glibc 的 gcc9.3.0 交叉编译器是使用多库构建的,并提供以下多库:
arm/v5te/hard;@marm@march=armv5te+fp@mfloat-abi=hard
thumb/nofp;@mthumb@mfloat-abi=soft
thumb/v7/nofp;@mthumb@march=armv7@mfloat-abi=soft
thumb/v7+fp/softfp;@mthumb@march=armv7+fp@mfloat-abi=softfp
thumb/v7+fp/hard;@mthumb@march=armv7+fp@mfloat-abi=hard
thumb/v7-r+fp.sp/softfp;@mthumb@march=armv7-r+fp.sp@mfloat-abi=softfp
thumb/v7-r+fp.sp/hard;@mthumb@march=armv7-r+fp.sp@mfloat-abi=hard
thumb/v7-a/nofp;@mthumb@march=armv7-a@mfloat-abi=soft
thumb/v7-a+fp/softfp;@mthumb@march=armv7-a+fp@mfloat-abi=softfp
thumb/v7-a+fp/hard;@mthumb@march=armv7-a+fp@mfloat-abi=hard
thumb/v7-a+simd/softfp;@mthumb@march=armv7-a+simd@mfloat-abi=softfp
thumb/v7-a+simd/hard;@mthumb@march=armv7-a+simd@mfloat-abi=hard
thumb/v7ve+simd/softfp;@mthumb@march=armv7ve+simd@mfloat-abi=softfp
thumb/v7ve+simd/hard;@mthumb@march=armv7ve+simd@mfloat-abi=hard
thumb/v8-a/nofp;@mthumb@march=armv8-a@mfloat-abi=soft
thumb/v8-a+simd/softfp;@mthumb@march=armv8-a+simd@mfloat-abi=softfp
thumb/v8-a+simd/hard;@mthumb@march=armv8-a+simd@mfloat-abi=hard
为 ARM 构建 glibc 2.31 适用于目标:
-marm -march=armv5te+fp -mfloat-abi=softfp
但是,对于任何带有 THUMB 的 ARM 目标,构建都会失败(出现相同的错误),即:
-mthumb -march=armv7 -mfloat-abi=soft
与 THUMB 的链接错误如下:
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs -Wl,-z,now \
/home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os -Wl,--version-script=/home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/ld.map \
-Wl,-soname=ld-linux.so.3 \
-Wl,-defsym=_begin=0
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os: in function `init_tls':
rtld.c:(.text+0x520): undefined reference to `__libc_do_syscall'
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os: in function `dl_main':
rtld.c:(.text+0x2426): undefined reference to `__libc_do_syscall'
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os: in function `_dl_lookup_symbol_x':
(.text+0x798c): undefined reference to `__libc_do_syscall'
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os: in function `_dl_relocate_object':
(.text+0x913e): undefined reference to `__libc_do_syscall'
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os: in function `_dl_fixup':
(.text+0xabac): undefined reference to `__libc_do_syscall'
/home/piotro/minimyth-dev/images/build/usr/lib/gcc/arm-minimyth-linux-gnueabi/9.3.0/../../../../arm-minimyth-linux-gnueabi/bin/ld: /home/piotro/minimyth-dev/script/devel/glibc/work/main.d/glibc-2.31_build/elf/librtld.os:(.text+0xafc0): more undefined references to `__libc_do_syscall' follow
collect2: error: ld returned 1 exit status
整体而言(完全相同的构建过程,具有完全相同的源+脚本)适用于:i386、x86_64、aarch64 和非 THUMB ARM 目标 - 使用 THUMB 的目标的 ARM 构建失败我认为是 glibc 中的错误。
唯一会触发失败的是将编译器标志从-marm更改为-mthumb
我已经为此填写了 glibc 错误报告 (#25920) - 但决定在这里询问,因为关于 glibc 错误跟踪器的对话似乎有点无效......
也许有人知道如何继续前进?
解决方案
看起来 glibc 需要小补丁才能成功交叉编译 armv7-a 目标:https ://github.com/warpme/minimyth2/blob/master/script/devel/glibc/files/glibc-2.31-fix-building-手臂拇指补丁。
通过上面的补丁,我成功地测试了以下目标列表的交叉编译:
-marm -march=armv5te+fp -mfloat-abi=softfp
-mthumb -march=armv7-a -mfloat-abi=soft
-mthumb -march=armv7-a+fp -mfloat-abi=softfp
-mthumb -march=armv7-a+simd -mfloat-abi=softfp
-mthumb -march=armv7ve+simd -mfloat-abi=softfp
推荐阅读
- r - 通过 2 个变量对许多数据集 R 进行聚类
- mysql - 按长度(城市)排序 ASC 限制 1;在 MYSQL 中不显示第一项
- amazon-web-services - AWS Athena 与 Power BI 服务
- r - 按组完成时 data.table 中的 na.locf
- react-native - React Native 中的导航转到错误的页面
- c# - 搜索多个列表并更新另一个列表中的字段
- python - 打印数字表(模式)的任务
- .htaccess - .htaccess 站点地图重写/重定向
- docker - 连接到专用 Docker 机器时如何默认使用 Docker Compose 生产配置?
- reactjs - axios 删除 API 不起作用(使用 JSON 服务器)