Почему опция '-- oformat binary ' компоновщика gnu помещает `.сегмент данных на 0x0200000



Я писал какой-то" свободный " код для реального режима i386 и наткнулся на некоторые странные ошибки, когда PXE netbooting мой код:



PXE-E79: NBP is too big to fit in free base memory
PXE-M0F: Exiting Intel Boot Agent.


После долгой возни с моими двоичными файлами я выделил его как имеющий любые данные или код после



.data


Маркер сегмента.



После hexdumping я обнаружил, что ld переместил инструкции полностью в 0x0200000 из всех мест.



В данный момент я генерирую свою плоскую корзину с:



ld --oformat binary




вопросы:





  1. Почему ld делает это?



  2. Является ли это специфичным для варианта oformat?


589   2  

2 ответов:

1) компоновщик, вероятно, делает это, потому что ему так показалось (например, возможно, для выравнивания с "2 MiB страницами" на 80x86), и потому что вы не предоставили сценарий компоновщика, который говорит делать что-либо, кроме "того, что компоновщик чувствует".

2) я бы предположил, что все выходные форматы делают "все, что чувствует компоновщик" (если только компоновщику не говорят иначе).

Примечание: фактическое поведение может быть определено сценарием компоновщика по умолчанию, скрытым где-то, и может быть "независимо от того, что распределение ОС ощущалось как" а не просто "то, что чувствовал компоновщик".

В любом случае, если вы хотите, чтобы компоновщик сделал что-то конкретное, вам нужно сказать компоновщику конкретно, что вы хотите, написав сценарий компоновщика. Если вы действительно написали сценарий компоновщика "менее специфичный, чем это необходимо", то вам нужно сделать этот сценарий более специфичным.

1-ld использует сценарий компоновщика по умолчанию. Попробуйте -v, чтобы увидеть ваш дефолт 2-не является специфичным для oformat 3-чтобы установить другой размер, вы должны использовать - z max-Page-size=0x

Я пробовал с 0x100 и 0x1000 и работать нормально, но 0x500 не работает.

Salu2 totales

Comments

    Ничего не найдено.