2012-05-07 2 views
3

Я писал код «свободного места» для реального режима i386 и наткнулся на некоторые странные ошибки, в то время как PXE netbooting мой код:Почему опция `--oformat двоичная 'для компоновщика gnu помещает сегмент` .data' в 0x0200000

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

после долгого возился с моими бинарниками я изолировав его как имеющий любых данные или код после сегмента маркеров

.data 

.

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

Я в настоящее время генерации мой плоский ящик с:

ld --oformat binary 

Вопросы:

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

  2. Это конкретный параметр oformat?

ответ

1

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

2) Я бы предположил, что все выходные форматы «независимо от компоновщика» (если только компоновщик не говорит иначе).

Примечание. Фактическое поведение может быть определено с помощью сценария компоновщика по умолчанию, который может быть скрыт где-то, и может быть «независимо от того, какое распределение ОС было похоже», а не просто «независимо от того, что чувствовал линкер».

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

+0

Спасибо, я оставлю вопрос открытым, если кто-нибудь знает, почему именно он это делает. Спасибо за ваш ответ. – Hawken

+0

Что вы подразумеваете под 2 страницами MiB? – Hawken

0

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

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

Salu2 всего

 Смежные вопросы

  • Нет связанных вопросов^_^