首页 > 解决方案 > 如果使用了 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 错误跟踪器的对话似乎有点无效......

也许有人知道如何继续前进?

标签: armglibcthumb

解决方案


看起来 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

推荐阅读