Собираю бинарник в режиме freestanding. (Исполняемые файлы для моего pet project — мелкой самописной ОС). В заголовок файла записывается тип DYN, а должен быть — EXEC.
Команда для сборки такая:
gcc -m32 -O2 -march=pentium -pipe -fno-omit-frame-pointer -fno-strict-aliasing -ffreestanding -fno-stack-protector -Wall -W -Wshadow -Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wmissing-format-attribute -Wredundant-decls -nostdinc -nostdlib -Wl,--warn-common,-X,--oformat,elf32-i386 [дальше куча файлов .o и .a] -o login
Несколько версий GCC назад всё работало как надо. Не пойму, что ему не нравится. Единственная разница в конфигурации (кроме версии ПО) в том, что раньше собирал нативным 32-битным компилятором, а сейчас кросскомпилирую с x86_64.
Было:
Заголовок ELF:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Класс: ELF32
Данные: дополнение до 2, от младшего к старшему
Версия: 1 (current)
OS/ABI: UNIX - System V
Версия ABI: 0
Тип: EXEC (Исполняемый файл)
Машина: Intel 80386
Версия: 0x1
Адрес точки входа: 0x8048cd0
Начало заголовков программы: 52 (байт в файле)
Начало заголовков раздела: 6940 (байт в файле)
Флаги: 0x0
Размер этого заголовка: 52 (байт)
Размер заголовков программы: 32 (байт)
Число заголовков программы: 7
Размер заголовков раздела: 40 (байт)
Число заголовков раздела: 18
Индекс табл. строк загол. раздела: 17
Стало:
Заголовок ELF:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Класс: ELF32
Данные: дополнение до 2, от младшего к старшему
Версия: 1 (current)
OS/ABI: UNIX - System V
Версия ABI: 0
Тип: DYN (Совм. исп. объектный файл)
Машина: Intel 80386
Версия: 0x1
Адрес точки входа: 0x1080
Начало заголовков программы: 52 (байт в файле)
Начало заголовков раздела: 8532 (байт в файле)
Флаги: 0x0
Размер этого заголовка: 52 (байт)
Размер заголовков программы: 32 (байт)
Число заголовков программы: 9
Размер заголовков раздела: 40 (байт)
Число заголовков раздела: 18
Индекс табл. строк загол. раздела: 17
Версия gcc — 7.2.0, версия LD — 2.29. Какае версии были раньше уже не вспомню (2012-й год это был).