GCC (MingW) + LD создает почти пустой исполняемый файл. Зачем?

Для конкретного требования мне нужно, чтобы мой двоичный файл упал ниже 510 байт.

Делая программу на ассемблере, я получаю <100 байт, при добавлении того же кода в C ++, результирующий код превышает 1 КБ. Если посмотреть получившийся двоичный файл, то в основном все (+ 90%) заполнены 0x00 символами (только несколько символов в начале и в конце заполнены).

В данный момент строим команды:

gcc -Wall -Os -s -Wl,--stack,32 -nostdinc -nostdinc++ -fno-ident -fno-builtin -I. -c -o cppFile.coff cppFile.cpp
nasm -f elf -o main.elf main.asm
ld -T link.ld -o out.elf main.elf cppFile.coff
objcopy -O binary out.elf out.bin

Размер сгенерированных файлов:

  1. cppFile.coff = 684 байта
  2. main.elf = 640
  3. out.elf = 2707
  4. out.bin = 1112

Когда нет связи с cppFile.coff (только с одной пустой функцией)

  1. out.elf = 1984
  2. out.bin = 31 (проверено и работает)

Почему GCC или LD добавляют так много нулевых символов?

Как убрать это пустое место?

ENTRY(start)
phys = 0x7c00;
HEAP_SIZE = 0;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
}
end = .;
}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …