Вопрос, связанный с перемещением.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
Более того, вы можете легко найти множество специфичных для архитектуры скриптов ссылок в Интернете.
Надеюсь, что это помогло!