Кросс-компиляция glibc для цели ARM не удается связать, если используется THUMB

Я пытаюсь создать cross-gcc для семьи arm.

Весь многоступенчатый процесс, который я использую для сборки 9.3gcc cross-gcc, работает нормально и создает рабочую систему для: i386, x86_64, aarch64 и ARM - но не работает в ARM для случая THUMB.

Кросс-компилятор gcc9.3.0, который я использую для сборки glibc, построен с использованием мульти-библиотек и предоставляет следующие мульти-библиотеки:

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

Сборка glibc 2.31 для ARM работает нормально для цели:

-marm -march = armv5te + fp -mfloat-abi = softfp

Однако сборка не выполняется (с той же ошибкой) для любой цели ARM с THUMB, т. Е .:

-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 и целей ARM, не относящихся к THUMB - неудачные сборки ARM для целей с THUMB, которые я рассматриваю как ошибку в glibc.

Единственное, что может вызвать сбой, - это изменить флаги компилятора с -marm на -mthumb.

Я уже заполнил отчет об ошибке glibc для этого (# 25920) - но решил спросить здесь, поскольку разговор об отслеживании ошибок glibc кажется немного неэффективным ...

Может кто-нибудь знает, как с этим двигаться дальше?


person user81604    schedule 05.05.2020    source источник
comment
Нет, это то, как библиотеки были построены и объединены с остальной частью инструментальной цепочки. вы также можете собрать armv5 для большого пальца, что случилось, когда вы это попробовали? он связан в библиотеках режима руки или режиме большого пальца? поскольку есть разные инструкции, хотелось бы иметь разные библиотеки, а набор инструментов и / или параметры командной строки должны сделать все это прямо.   -  person old_timer    schedule 04.06.2020


Ответы (1)


Похоже, для glibc требуется небольшой патч для успешной кросс-компиляции для целей armv7-a: https://github.com/warpme/minimyth2/blob/master/script/devel/glibc/files/glibc-2.31-fix-building-arm-thumb.patch.

С помощью вышеуказанного патча я успешно протестировал кросс-компиляцию для следующего списка целей:

-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
person user81604    schedule 09.05.2020