Обновление из старого набора инструментов на основе GCC, для которого нет исходного кода - PullRequest
3 голосов
/ 25 сентября 2019

Контекст: я пытаюсь обновить старую версию 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

Вопрос

Как заставить современный (упакованный) набор инструментов для

  1. установить Tag_DIV_use: Not allowed (== значение 1) атрибут файла ? ​​
  2. отключить soft-floatи установить флаг заголовка ELF 0x2 («имеет точку входа»)?

Примечание: я рад передать дополнительные параметры командной строки компоновщика или ассемблера или для создания другого объектафайл сюдаm некоторые потенциальные псевдо-коды, которые я до сих пор не нашел, но которые дают то, что мне нужно. Чего я бы хотел избежать, так это создать новый набор инструментов знаю , как это сделать, я сделал это - как с crosstool / crosstool-ng, так и вручную -, но это может быстро стать адом обслуживания), специфичным для того процессора ARM.Наши современные наборы инструментов предназначены для работы с несколькими моделями процессоров, поэтому мне будет сложно принять ответ, предлагающий это.Тем более, что я мог легко написать свой собственный файл спецификаций GCC, чтобы использовать правильные аргументы командной строки как значения по умолчанию в моем процессе сборки.


Я частично добился успеха в поиске исходного кода binutils и нашел следующеестрока в наборе тестов для gas:

.eabi_attribute Tag_DIV_use, 1

Но пока нет способа сделать это глобально из командной строки.

...