2017-01-03 3 views
1

J'ai le code assembleur suivantcode assembleur Power8 avec le numéro de construction partagée avec la sauvegarde et la restauration des TOC

 .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 

Cela fonctionne très bien avec de l'électricité statique, mais la construction partagée donne une erreur de segmentation dans [email protected]@GLIBC_2.22, si la construction partagée être manipulé différemment dans power8 par rapport à TOC?

+0

est le symbole 'function_call' dans un objet local, ou une bibliothèque? –

Répondre

1

La convention d'appel est la même entre POWER 8 et les processeurs précédents. Cependant, il y a eu des changements en ce qui concerne le pointeur TOC (r2) traitant entre ABIv1 et ABIv2.

Dans ABIv2, l'appelant n'établit pas le pointeur de table des matières au r2; la fonction appelée doit le faire pour les points d'entrée globaux (c'est-à-dire, où le pointeur TOC peut ne pas être le même que celui utilisé dans l'appelé). Pour ce faire, les fonctions ABIv2 auront un prologue qui établit r2:

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

- cela dépend de r12 contenant l'adresse du point d'entrée global de la fonction (les 0 valeurs seront remplacés par des décalages réels au moment de la liaison finale) .

Je ne vois aucun paramètre de code r12 dans votre exemple. Êtes-vous sûr de vous conformer à l'ABI v2?

La spécification ABIv2 est disponible ici: https://members.openpowerfoundation.org/document/dl/576 La section 2.3.2 sera la plus pertinente pour ce problème.

+0

Oui, j'ai "' '' addis 2, 12, 0 addi 2, 2, 0''' avant de régler la taille de la pile 'stdu 1, -240 (1)'. Mais toujours obtenir la même faute de segmentation. function_call est une fonction C externe – Ramya

+0

Où sont ces instructions 'addis'? Est-ce que 'function_call' est également conforme à ABIv2? –

+0

J'ai ajouté 'myfunc: .LCF1: 0:.. Addis 2,12, .toc .- LCF1 @ ha Addi 2,2, .toc .- LCF1 @ l .localentry myfunc, .- myfunc' – Ramya