Перемещаемые символы в формате ELF (язык ассемблера)

Мы разрабатываем порт GNU Assembler для клиентской архитектуры. Теперь проблема заключается в том, что:

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

Например:

j label1 + label2

где label1 и label2 определены в перемещаемых разделах, они могут быть теми же разделами или разными перемещаемыми разделами.

Ответ 1

ELF не знает о инструкциях, как таковых. Он знает о конкретных кодировках смещений символов в инструкциях. В ассемблере вам нужно будет вывести две записи перемещения, каждая из которых имеет соответствующий триплет (адрес, тип, символ), чтобы правильно исправить эту часть инструкции. Компилятор не обязательно даже знал бы, что эти две записи указывают на одну и ту же инструкцию.

Типы переселения ELF полностью зависят от процессора (или, точнее, зависят от ISA), поэтому вы можете свободно определять любые перестановки, необходимые для новой архитектуры.

Трудно быть более конкретным без подробностей о кодировании команд.

Ответ 2

Я знаю jack о ELF и только немного больше о ссылке, но...

Я бы ожидал, что каждый операнд обрабатывается так же, как если бы он был только один.

OTOH может быть проблема в том, что формат для j изменяется в зависимости от того, где эти метки? Если это так, я думаю, что вы потоплены, поскольку линкеры недостаточно умен, чтобы делать такие вещи (система сборки ADA IIRC может быть более умной, чем большинство, чтобы вы могли посмотреть на нее.)

Ответ 3

Я бы ожидал одну запись на адрес для каждой команды, которая нуждается в переносе.

Objdump может отображать таблицу перемещения исполняемого или объектного файла, но я не знаю флагов.

Мое предложение - попытаться выкопать инструкцию x86 (или другую CISC), которая делает что-то похожее на то, что делает ваша клиентская арка, и посмотреть, какие перестановки возникают при сборке/связывании.