Вопрос, связанный с перемещением.rodata

Я пытаюсь написать программу на C для машины без виртуальной памяти (или, если быть более точным, ОС), и у меня возникают некоторые трудности с разделом.rodata, или, точнее, с тем, что там происходит. Проблема заключается в том, что, хотя разделы располагаются по четко определенным адресам во время компоновки, когда программа переходит в исполнение, она перемещается.

Например: допустим, что моя программа запускается с начала 0x1000, когда она выполняется, то, что должно быть в 0x1000, перемещается в 0xff1000.

Как говорится, моя проблема в том, что материал, который обычно входит в.rodata, "жестко кодируется" компилятором (gcc), и я теряю указанные константы.rodata в памяти из-за перемещения и gcc жестко кодирует их адреса, чтобы они получить абсолютное смещение вместо относительного.

Есть ли способ, которым я могу получить константы.rodata иметь относительное смещение вместо абсолютного. А под относительным я подразумеваю относительно каких-либо активных процессов регистры?

1 ответ

В зависимости от архитектуры, возможно, что.rodata произвольно перемещается в определенную область памяти (например, в ПЗУ). Такую информацию можно найти в техническом описании вашего компьютера. Если вы в этом случае, вы должны указать ссылку, чтобы поместить раздел.rodata в нужную область, используя скрипт компоновщика. Хороший обзор того, как работают скрипты компоновщика GCC, можно найти здесь:

http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html

Более того, вы можете легко найти множество специфичных для архитектуры скриптов ссылок в Интернете.

Надеюсь, что это помогло!

Другие вопросы по тегам