linux ld -Ttext не может создать исполняемый файл с правильной орг

Я работаю над 32-битным ядром в защищенном режиме. Я пытаюсь сгенерировать код, текстовая область которого начинается с 0x100000. Я выдаю следующую команду: =

ld -melf_i386 $ (OBJS) -o ядро ​​-Текст 0x100000

Я ожидаю, что при проверке результирующего 32-битного файла ELF значение e_entry будет равно 0x100000. Тем не менее, это не так, и это мой вопрос, так как я не уверен, почему. Часть ядра написана на языке nasm и компилируется на 64-битном linux с целью 32-битного ELF. Фактическое значение e_entry, которое создается вышеуказанной командой ld, равно 0x116D5A. Мне интересно, связано ли это с каким-то параметром компилятора, который мне нужен, например -fpic, или с какой-то несовместимостью с генерируемым nasm кодом, или, возможно, есть ошибка в ld? Может кто-нибудь, пожалуйста, помогите. Спасибо

Следует отметить, что указав опцию -r для ld выше, как в:= ld -r -melf_i386 $(OBJS)-o kernel -Ttext 0x100000

Создает вывод, где e_entry равен 0x100000, однако файл не является исполняемым файлом. Мне нужно, чтобы он был исполняемым.

1 ответ

У вас есть скрипт компоновщика? Лучше написать свой собственный, чтобы переопределить скрипт компоновщика по умолчанию, так как вы хотите точно контролировать вывод.

Что-то вроде этого,

ENTRY(entry)

SECTIONS
{
    .  = 0x100000;

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

Выше можно использовать, когда MMU не включен.

Если у вас включен MMU, следующее будет связывать ваше ядро ​​с 0xC0000000 (3 ГБ), в то же время загружая его по адресу 0x100000.

.  = 0xC0100000;

.text : AT(0x100000) {
    *(.text)
}
Другие вопросы по тегам