Я относительно новичок в сборке и работаю с чипом powerpc. Я использую gcc crosscompiler и работаю со средой buildroot (только для фона).Позиция зависимая, независимый код и глобальные переменные в сборе PowerPC
Я добавляю код в раздел .head некоторого кода, который создаст объект .elf (позволяет называть его target.elf для аргументов), который получает в большую двоичную информацию через buildroot. target.elf определяется как начинающийся с адреса 0x0 в коде и локальном компоновщике, но позже будет перемещен в другое местоположение адреса. Я хочу ссылаться на глобальную переменную, которая разделяется между кодом сборки и c-файлом, из кода сборки. Когда я это делаю, используя независимые от местоположения средства, я сталкиваюсь с проблемами. Когда я использую GOT в качестве ссылки (например, символ @ получил @ h), я могу правильно ссылаться на символ.
Это проблема, потому что я хочу создать обработчик прерываний, который не зависит от наличия правильного указателя на стек или TOC при входе, и мне нужен ТОС для использования GOT.
Есть ли способ сделать это без ТОС?
Вот несколько примеров кода:
Неправильный результат (% r3 не содержит того, что «символ» содержит):
.global symbol
symbol:
.long 0
.global irq_handler
irq_handler:
addi %r3, 0, 0
ori %r3, %r3, [email protected]
ld %r3, 0(%r3)
b .
In global area of C-file:
extern uint64_t symbol;
Я также попытался определения символа в с-файла (так без extern, но все же как глобальный) и опуская определение в asm-файле. Это также потерпело неудачу.
Я также принимаю ярлык и загружаю только часть @l адреса, потому что верхние 32 бита равны 0x0.
Правильный результат (% г3 действительно содержит то, что «символ» содержит):
.global irq_handler
irq_handler:
ld %r3, [email protected](%r2)
ld %r3, 0(%r3)
b .
Обратите внимание, что в правильном примере ТОС доступен в% r2.
Заранее спасибо.
Я не понимаю, как вы можете иметь * "обработчик прерываний, который не зависит от наличия действительного указателя на стек" * –
Обработчик прерываний предоставляет средство для разветвления в другом * контексте *. Для этой ситуации я создам резервную копию текущего контекста (регистров) в известном месте до перехода в новый контекст. Когда я вернусь, регистры будут в неопределенном состоянии. Когда irq запускается снова, я верну исходный контекст, но хочу обратиться к символу перед восстановлением TOC. Обработчик прерываний также выполняет другие функции, не вдаваясь в подробности. – Tyler
Уточнение для вышеуказанного комментария: Возврат из другого контекста облегчается путем вызова одного и того же обработчика прерываний. При повторном вызове регистры находятся в неизвестном состоянии и будут восстановлены после проверки «символа». – Tyler