. = 0x7c00;
.text :
{
__start = .;
*(.text)
/* Place the magic boot bytes at the end of the first 512 sector. */
. = 0x1FE;
SHORT(0xAA55)
}
0x7C00 вы говорите компоновщику (это не язык ассемблера, кстати, не связанный). что я хочу, чтобы следующая вещь была по адресу 0x7C00 в адресном пространстве (для процессора). ниже .text означает, что мы хотим, чтобы код .text был связан, начиная с адреса 0x7C00. Так что если есть какая-либо позиция, указанная c, то она будет основана на этом адресе.
__ start дайте мне адрес на данный момент (в пределах .text)
* (. Text) поместите весь текст .text здесь
. = 0x1FE переместите указатель на 0x1FE в пределах .text
SHORT (0xAA55) поместите эти два байта здесь со смещением 0x1Fe и 0x1FF в .text
Таким образом, предполагая, что код соответствует, это дает байт 0x200 BLOB-объект, который должен быть загружен в 0x7C00 в адресном пространстве.
Теперь, когда вы задаете objcopy -O binary hello.elf hello.bin
, инструмент будет искать первую загружаемую вещь и Первая часть выходного файла - это первая загружаемая вещь. Если это единственное, что у вас есть в «двоичном файле», то байты 0x200 будут go к файлу hello.bin.
Информация, которая говорит вам, что 0x7C00 - это то, где это должно быть найдено процессор, теряется в этом двоичном формате. у эльфа это было у других, но у этого нет.
Далее, если у вас были эти 0x200 байтов в 0x7C00, и у вас были еще 2 байта в 0x8000, то двоичный вывод -O будет иметь длину 0x402 байта. Первые 0x200 байтов будут получены из .text при 0x7C00 с наименьшей загружаемой вещью, затем 0x200 байтов заполнения, так что следующие за байтами относительно начала файла будут в нужном месте, если вы взяли hello.bin и поместили в 0x7c00 тогда эти два байта будут в 0x8000.
Если бы у вас были эти 0x200 в 0x7C00 и вы должны были добавить еще один элемент в скрипт компоновщика с 0x02 байта в 0x7000, то hello.bin начался бы с этих двух байтов там будет 0xBFE байтов заполнения, а затем 0x200 байтов .text. так что когда bin-файл был загружен в память со скоростью 0x7000, два байта и байты 0x200 находятся в нужном месте.
Таким образом, двоичный файл objcopy -O создает по существу образ памяти того, что необходимо загрузить, иногда с заполнение, но без информации о том, что начальный адрес для этой нагрузки. Это вы просто должны знать.
Файл elf будет также содержать 0xAA55 в некоторой форме, я бы предположил, что целые 0x200 байтов - это одна вещь, показанная в .text, но, возможно, она разбила его на два элемента. Зависит от инструмента, который создал эльфа, в зависимости от того, каким образом и каков отступ.