Это выделяет некоторые BSS переменные:Почему выравнивание переменной .bss вызывает значительное увеличение бинарного размера?
.lcomm page_table_l2, 4096
.lcomm page_table_l3, 4096
.lcomm page_table_l4, 4096
Двоичного Я здание заканчивает тем, что 4792 байт, так что вы можете увидеть, что переменный BSS не включены непосредственно (или бинарный будет> 12 KiB).
Однако эти три должны быть 4 KiB выровнены, поэтому я изменить раздел:
.section .bss
.align 4096
.lcomm page_table_l2, 4096
.lcomm page_table_l3, 4096
.lcomm page_table_l4, 4096
... и двоичная вырастает до 8760! Учитывая, что BSS должен быть просто запиской в бинарном выражении ELF для компоновщика, эй, назначьте n байтов обнуленного хранилища, Почему выравнивание переменной BSS вызывает любой рост двоичного файла вообще?
Вы можете увидеть это в C, тоже:
char x[4096] __attribute__ ((aligned (8192))) = {0};
Если изменить выравнивание, размер объекта выходной файл изменяется вместе с ним. (хотя в моем первоначальном примере я смотрю размер финального двоичного файла.)
Обратите внимание, что этот выходной двоичный файл является ядром ОС; Я следую учебнику here. Я использую следующий линкер скрипт:
ENTRY(start)
SECTIONS {
. = 1M;
.boot ALIGN(8) : AT(ADDR(.boot))
{
/* ensure that the multiboot header is at the beginning */
KEEP(*(.multiboot_header))
}
.text :
{
*(.text)
}
}
Согласно objdump
, это вид выглядит как вся программа получает 4 KiB выровнены в самом эльфа, что немного странно.
Без .align
:
Sections:
Idx Name Size VMA LMA File off Algn
0 .boot 00000018 0000000000100000 0000000000100000 00000078 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
С .align
:
Sections:
Idx Name Size VMA LMA File off Algn
0 .boot 00000018 0000000000100000 0000000000100000 00001000 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
Примечание File off
, или смещение раздела в файле. Почему это меняется?
С какими командами вы строите? 'gcc -nostdlib'? Создание простой ELF-бинарной? Кроме того, я не знал, что многозадачные ядра получили сегменты text/data/bss; это довольно причудливо. Учебник, который вы используете, использует NASM, поэтому нетрудно представить, что газ работает немного по-другому. выравнивание вещей в BSS. Во всяком случае, для этого [mcve] потребуется всего несколько строк команд и заметок о том, какой блок кода входит в какое имя файла, не так ли? Это интересно и заставляет меня попробовать, но не настолько, чтобы догадаться, что именно вы сделали: P –
@MichaelPetch: Да, я согласен, ясно, что это ELF-бинарный файл. Я просто не знаю достаточно о том, чтобы сделать многозадачные изображения ядра, чтобы узнать, будет ли что-то особенное, что вы сделали бы для этого, было бы уместным или если вы ожидаете такого же поведения при создании исполняемого файла .o или обычного Linux. Я не сомневался, что многозагрузочный загрузчик GRUB будет нулевым BSS для вас, я просто сказал, что не знаю, что было поддержано, пока я не прочитал его сейчас. :П –