2017-01-03 4 views
1

У меня есть следующий код сборкиPower8 кода сборки с общим вопросом сборки с сохранением и восстановлением ТОС

 .machine power8 
     .abiversion 2 
     .section  ".toc","aw" 
     .section  .text 
     GLOBAL(myfunc) 
myfunc: 
     stdu 1,-240(1) 
     mflr 0 
     std 0, 0*8(1) 
     mfcr 8 
     std 8, 1*8(1) 
     std 2, 2*8(1) 
     # Save all non-volatile registers R14-R31 
     std 14, 4*8(1) 
     ... 
     # Save all the non-volatile FPRs 
     ... 
     stwu 1, -48(1) 
     bl function_call 
     nop 
     addi 1, 1, 48 
     ld 0, 0*8(1) 
     mtlr 0 
     ld 8, 1*8(1) 
     ld 2, 2*8(1) 
     ... 
     # epilogue, restore stack frame 

Это прекрасно работает со статической сборкой, но общая сборка дает сбой сегментации в [email protected]@GLIBC_2.22, должен быть общая сборка обрабатывается по-разному в силе8 wrt TOC?

+0

является символом 'function_call' в локальном объекте или библиотеке? –

ответ

1

Вызывающее соглашение одинаково между POWER 8 и предыдущими процессорами. Однако произошли изменения в отношении указателя TOC (r2) между ABIv1 и ABIv2.

В ABIv2 вызывающий абонент не устанавливает указатель TOC в r2; вызываемая функция должна делать это для глобальных точек входа (т. е. где указатель TOC может быть не таким, как тот, который используется в вызываемом абоненте). Для этого, функций ABIv2 будут пролог, который устанавливает r2:

0000000000000000 <foo>: 
    0: 00 00 4c 3c  addis r2,r12,0 
    4: 00 00 42 38  addi r2,r2,0 

- это зависит от r12 содержащего адрес глобальной точки входа функции (в этих значения 0 будут заменены реальными сдвигами в последний раз ссылки) ,

Я не вижу никаких настроек кода r12 соответственно в вашем примере. Вы уверены, что согласны с v2 ABI?

Спецификация ABIv2 доступна здесь: https://members.openpowerfoundation.org/document/dl/576 Раздел 2.3.2 будет наиболее актуальным для этой проблемы.

+0

Да, у меня есть '' 'addis 2, 12, 0 addi 2, 2, 0''' перед установкой размера стека' stdu 1, -240 (1) '. Но по-прежнему возникает одна и та же ошибка сегментации. function_call - внешняя функция C – Ramya

+0

Где эти инструкции 'addis'? Соответствует ли 'function_call' ABIv2? –

+0

я добавить 'MyFunc: .LCF1: 0:.. Addis 2,12, .toc .- LCF1 @ ха Адди 2,2, .toc .- LCF1 @ л .localentry MyFunc, .- myfunc' – Ramya

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