Почему опция '-- 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
вопросы:
Почему
ldделает это?
Является ли это специфичным для варианта
oformat?
2 ответов:
1) компоновщик, вероятно, делает это, потому что ему так показалось (например, возможно, для выравнивания с "2 MiB страницами" на 80x86), и потому что вы не предоставили сценарий компоновщика, который говорит делать что-либо, кроме "того, что компоновщик чувствует".
2) я бы предположил, что все выходные форматы делают "все, что чувствует компоновщик" (если только компоновщику не говорят иначе).Примечание: фактическое поведение может быть определено сценарием компоновщика по умолчанию, скрытым где-то, и может быть "независимо от того, что распределение ОС ощущалось как" а не просто "то, что чувствовал компоновщик".
В любом случае, если вы хотите, чтобы компоновщик сделал что-то конкретное, вам нужно сказать компоновщику конкретно, что вы хотите, написав сценарий компоновщика. Если вы действительно написали сценарий компоновщика "менее специфичный, чем это необходимо", то вам нужно сделать этот сценарий более специфичным.
1-ld использует сценарий компоновщика по умолчанию. Попробуйте -v, чтобы увидеть ваш дефолт 2-не является специфичным для oformat 3-чтобы установить другой размер, вы должны использовать - z max-Page-size=0x
Я пробовал с 0x100 и 0x1000 и работать нормально, но 0x500 не работает.
Salu2 totales
Comments