Будет ли команда ENTRY (символ) всегда помещать инструкцию в символ в начале раздела .text? - PullRequest
0 голосов
/ 04 мая 2019

В соответствии с Использование ld doc :

Язык команд компоновщика включает команду, специально предназначенную для определения исполняемой команды first в выходном файле (его точка входа).

Как понять первый здесь?Это логически первая инструкция для перехода?Или это физически первая инструкция для размещения в секции .text?

Я использую ниже скрипт компоновщика из здесь в качестве эксперимента:

ENTRY(__entry)  /* <=============== HERE, the __entry  */

/*kernel will be loaded at this address after boot*/
INCLUDE linker.ld

SECTIONS
{
    /*kernel will be compiled with virtual address base at 2GB*/
    . = 0x80000000 + start_address; /*2GB + start_address = (0x80010000)*/
    PROVIDE(_kernel_start = .); /*defined at kernel/include/kernel.h, set to 0x80010000*/

 .text : AT(start_address) 
    {
        *(.text)
    }

    .data : 
    { 
        *(.data) 
    }

    .bss : 
    { 
        *(.bss COMMON)
    }
    . = ALIGN(8);
    PROVIDE(_fb_start = .); 
    . += framebuffer_size;

    PROVIDE(_kernel_end = .); /*defined at kernel/include/kernel.h*/
}

Я пытался найти байты инструкций в __entry в окончательном встроенном двоичном файле.И обнаружил, что эти инструкции действительно находятся в начале раздела .text.

Значит ли это, что команда ENTRY() всегда помещает точку входа в начало финальной части?бинарный .text раздел?

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Машинная инструкция first в исполняемом файле означает команду, которая выполняется first. Он не должен быть первым (с наименьшим смещением) из упорядоченного списка всех инструкций в сегменте .text .

Многие программы написаны в естественном стиле сверху вниз , и их запись действительно указывает на физически первую инструкцию (со смещением ноль). Однако программный код может также начинаться с вспомогательных подпрограмм, и в этом случае его точка входа будет смещаться глубже в коде.

0 голосов
/ 07 мая 2019

ENTRY(__entry) запишет расположение VMA символа __entry в конечном объектном файле.Например, в заголовке ELF.После того, как загрузчик загрузит каждую секцию объектного файла в память, загрузчик или среда выполнения просто перейдут к точке входа.

Но в моем сценарии ENTRY(__entry) на самом деле не обязательно .Потому что EwokOS работает на голой машине и нет загрузчика.Как я и пытался, если я закомментировал ENTRY(__entry), EwokOS все еще может загружаться на голом металле.

Причина, по которой первая инструкция __entry является первой инструкцией финальной EwokOS.bin file, представляет собой комбинацию двух факторов:

  • порядок ввода объектного файла для компоновщика ld

  • порядок кодированияв файле boot.S.

В файл ld подается 3 файла в порядке boot.o system.o context.o.Таким образом, мы видим, что boot.o - это первый объектный файл для связи.

А файл boot.S, который собирается в boot.o, содержит __entry в качестве первая строка кода.

Эти 2 фактора приводят к тому, что __entry находится в начале финальной EwokOS.bin, которая извлекается из секции .text в EwokOS.elf.

И в моем сценарии мне нужно, чтобы __entry отображался в начале файла EwokOS.bin, потому что файл bin загружается по адресу 0x10000, который является начальным адресом QEMU.ARM versatilepb виртуальная машина.

...