2016-03-31 1 views
-1

Я относительно новичок в сборке и работаю с чипом 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.

Заранее спасибо.

+1

Я не понимаю, как вы можете иметь * "обработчик прерываний, который не зависит от наличия действительного указателя на стек" * –

+0

Обработчик прерываний предоставляет средство для разветвления в другом * контексте *. Для этой ситуации я создам резервную копию текущего контекста (регистров) в известном месте до перехода в новый контекст. Когда я вернусь, регистры будут в неопределенном состоянии. Когда irq запускается снова, я верну исходный контекст, но хочу обратиться к символу перед восстановлением TOC. Обработчик прерываний также выполняет другие функции, не вдаваясь в подробности. – Tyler

+0

Уточнение для вышеуказанного комментария: Возврат из другого контекста облегчается путем вызова одного и того же обработчика прерываний. При повторном вызове регистры находятся в неизвестном состоянии и будут восстановлены после проверки «символа». – Tyler

ответ

0

Похоже, что ответ заключается в том, что TOC - это, необходимый для определения местоположения независимо от кода.

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