Контекст: я пытаюсь обновить старую версию GCC до более новой, и для ее работы не хватает только двух или трех частей головоломки (кажется).
Старый набор инструментов настроенследующим образом:
$ /opt/arm-2012.03/bin/arm-none-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=/opt/arm-2012.03/bin/arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/arm-2012.03/bin/../libexec/gcc/arm-none-linux-gnueabi/4.6.3/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: /scratch/nsidwell/arm/linux/src/gcc-4.6-2012.03/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2012 -D__CS_SOURCERYGXX_MIN__=3 -D__CS_SOURCERYGXX_REV__=57 %{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2012.03-57' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/nsidwell/arm/linux/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpc=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-libelf=/scratch/nsidwell/arm/linux/obj/host-libs-2012.03-57-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/nsidwell/arm/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/nsidwell/arm/linux/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.6.3 (Sourcery CodeBench Lite 2012.03-57)
Конечная цель - собрать ядро (Linux) с обновленным набором инструментов.На данный момент я пытаюсь получить arm-linux-gnueabi-gcc
(из пакета Ubuntu 18.04 gcc-arm-linux-gnueabi
, версия 4:7.4.0-1ubuntu2.3
) для выполнения моих ставок.
Тривиальные (привет стиль мира) бинарные файлы пользовательского интерфейса, созданные с помощью этого набора инструментов, работают подобноШарм.Тем не менее, ядро не будет загружаться, и поскольку плата, для которой предназначено это ядро, не показывает ничего с ядром, построенным таким образом, у меня нет никакой обратной связи относительно того, что не так (как я сделал бы с SIGILL
при запуске двоичного файла пользовательского пространства, содержащего «несовместимые вещи». Используемый двоичный файл (U-Boot) mkimage
по-прежнему является исходным, и его вывод идентичен независимо от того, использую ли я новый или старый набор инструментов для сборки vmlinux
.
Итак, до сих пор я использовал следующие два флага, которые, как я определил, использовались старым набором инструментов, но для которых новый набор инструментов имел различные значения по умолчанию:
-march=armv5te -mfix-cortex-m3-ldrd
Получившийся vmlinux
Двоичный файл отличается лишь несколькими аспектами, и я думаю, что в этом заключается проблема, которая не позволяет ядру загружаться.
С помощью gcc -v -E - </dev/null
для каждого набора инструментов я смог свести список различий вфлаги также пройдены, но некоторые флаги буквально изменились, и я не смог найти список флагов с информацией о том, как их перенести.коллеги ewer ...
Также кажется, что более новый readelf
, упакованный с gcc-arm-linux-gnueabi
, не знает о флаге 0x2 в e_flags
(флаги заголовка ELF), который имеет более старый readelf
"точка входа ", разница:
- Flags: 0x5000002, has entry point, Version5 EABI
+ Flags: 0x5000002, Version5 EABI, <unknown>
Пока что я не нашел способа установить этот флаг.
При сравнении свойств двух результирующих файлов vmlinux
различия несколькобольше, но кажется управляемым:
$ diff <(/opt/arm-2012.03/bin/arm-none-linux-gnueabi-readelf -hA ../vmlinux-gcc-4) <(/opt/arm-2012.03/bin/arm-none-linux-gnueabi-readelf -hA ../vmlinux-gcc-7)
--- /dev/fd/63 2019-09-25 16:25:22.056115611 +0200
+++ /dev/fd/62 2019-09-25 16:25:22.056115611 +0200
@@ -10,14 +10,14 @@
Version: 0x1
Entry point address: 0xc0008000
Start of program headers: 52 (bytes into file)
- Start of section headers: 3446116 (bytes into file)
- Flags: 0x5000002, has entry point, Version5 EABI
+ Start of section headers: 4919528 (bytes into file)
+ Flags: 0x5000200, Version5 EABI, <unknown>
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 3
Size of section headers: 40 (bytes)
- Number of section headers: 26
- Section header string table index: 23
+ Number of section headers: 27
+ Section header string table index: 26
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "5TE"
@@ -30,4 +30,3 @@
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
- Tag_DIV_use: Not allowed
Различия относительно заголовков разделов, вероятно, менее значимы, если вообще.Но то, что выделяется, это e_flags
(выбирая наиболее читаемый вывод из старого и нового readelf
):
- Flags: 0x5000002, has entry point, Version5 EABI
+ Flags: 0x5000200, Version5 EABI, soft-float ABI
... и атрибуты файла:
- Tag_DIV_use: Not allowed
Процессор, на который я нацеливаюсь, вот этот (для краткости обрезан):
Processor : ARM926EJ-S rev 5 (v5l)
Features : swp half thumb fastmult edsp java
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : DaVinci DA850/OMAP-L138/AM18x EVM
Так что, очевидно, (старый) набор инструментов был общим.
Для всестороннего сравнения результатов-Q --help=-target
для обоих наборов инструментов с более новым набором, использующим -march
и -mcpu
для нацеливания на конкретную модель процессора, то есть:
- old:
arm-none-linux-gnueabi-gcc -Q --help=target
против - новый:
arm-linux-gnueabi-gcc -march=armv5tej -mcpu=arm926ej-s -Q --help=target
... см. Эту "таблицу":
Option old new
-falign-arrays [disabled] n/a
-mabi= [empty] aapcs-linux
-mabort-on-noreturn [disabled] [disabled]
-mandroid [disabled] [disabled]
-mapcs [disabled] [disabled]
-mapcs-float [disabled] n/a
-mapcs-frame [disabled] [disabled]
-mapcs-reentrant [disabled] [disabled]
-mapcs-stack-check [disabled] [disabled]
-march= armv5te armv5tej
-marm [enabled] [enabled]
-masm-syntax-unified n/a [disabled]
-mbig-endian [disabled] [disabled]
-mbionic [disabled] [disabled]
-mcallee-super-interworking [disabled] [disabled]
-mcaller-super-interworking [disabled] [disabled]
-mcirrus-fix-invalid-insns [disabled] n/a
-mcmse n/a [disabled]
-mcpu= [empty] arm926ej-s
-mfix-cortex-m3-ldrd [enabled] [disabled]
-mflip-thumb n/a [disabled]
-mfloat-abi= [empty] soft
-mfp16-format= [empty] none
-mfp= [empty] n/a
-mfpe [disabled] n/a
-mfpe= [empty] n/a
-mfpu= [empty] vfp
-mglibc [enabled] [enabled]
-mhard-float [disabled] [empty]
-mlittle-endian [enabled] [enabled]
-mlong-calls [disabled] [disabled]
-mmusl n/a [disabled]
-mneon-for-64bits n/a [disabled]
-mpic-data-is-text-relative n/a [enabled]
-mpic-register= [empty] [empty]
-mpoke-function-name [disabled] [disabled]
-mprint-tune-info n/a [disabled]
-mpure-code n/a [disabled]
-mrestrict-it n/a [disabled]
-msched-prolog [enabled] [enabled]
-msingle-pic-base [disabled] [disabled]
-mslow-flash-data n/a [empty]
-msoft-float [disabled] [empty]
-mstructure-size-boundary= [empty] 8
-mthumb [disabled] [disabled]
-mthumb-interwork [enabled] [disabled]
-mtls-dialect= gnu gnu
-mtp= [empty] soft
-mtpcs-frame [disabled] [disabled]
-mtpcs-leaf-frame [disabled] [disabled]
-mtune= [empty] [default]
-muclibc [disabled] [disabled]
-munaligned-access [enabled] [disabled]
-mvectorize-with-neon-double n/a [disabled]
-mvectorize-with-neon-quad [disabled] [enabled]
-mword-relocations [disabled] [disabled]
-mwords-little-endian [disabled] n/a
Вопрос
Как заставить современный (упакованный) набор инструментов для
- установить
Tag_DIV_use: Not allowed
(== значение 1) атрибут файла ? - отключить soft-floatи установить флаг заголовка ELF 0x2 («имеет точку входа»)?
Примечание: я рад передать дополнительные параметры командной строки компоновщика или ассемблера или для создания другого объектафайл сюдаm некоторые потенциальные псевдо-коды, которые я до сих пор не нашел, но которые дают то, что мне нужно. Чего я бы хотел избежать, так это создать новый набор инструментов (я знаю , как это сделать, я сделал это - как с crosstool
/ crosstool-ng
, так и вручную -, но это может быстро стать адом обслуживания), специфичным для того процессора ARM.Наши современные наборы инструментов предназначены для работы с несколькими моделями процессоров, поэтому мне будет сложно принять ответ, предлагающий это.Тем более, что я мог легко написать свой собственный файл спецификаций GCC, чтобы использовать правильные аргументы командной строки как значения по умолчанию в моем процессе сборки.
Я частично добился успеха в поиске исходного кода binutils и нашел следующеестрока в наборе тестов для gas
:
.eabi_attribute Tag_DIV_use, 1
Но пока нет способа сделать это глобально из командной строки.