Question

Nous développons actuellement un port de GNU Assembler pour une architecture client. Maintenant, le problème est que:

Si un opérande immédiat d'une instruction est une expression impliquant plusieurs symboles pouvant être déplacés, comment est-il géré dans un fichier de sortie au format elf. Quelles seront les informations de réinstallation produites dans un tel cas?

Par exemple:

j label1 + label2

où label1 et label2 sont définis dans des sections relogeables, il peut s’agir des mêmes sections ou de différentes sections relogeables.

Était-ce utile?

La solution

ELF ne connaît pas les instructions, en soi. Il connaît des codages particuliers des décalages de symboles dans les instructions. Dans l'assembleur, vous devez générer deux enregistrements de déplacement, chacun avec le triplet [adresse, type, symbole] correspondant pour patcher correctement cette partie de l'instruction. L’éditeur de liens ne saurait même pas nécessairement que ces deux enregistrements renvoient à la même instruction.

Les types de relocalisation ELF dépendent entièrement de la CPU (ou, pour être plus précis, de l'ISA), vous êtes donc libre de définir toutes les relocalisations dont vous avez besoin pour une nouvelle architecture.

Il est difficile d’être plus spécifique sans détails sur le codage des instructions.

Autres conseils

Je connais Jack sur ELF et seulement un peu plus sur la liaison, mais ...

Je m'attendrais à ce que chaque opérande soit traité de la même manière que s'il n'y en avait qu'un.

OTOH pourrait-il être à l'origine du problème suivant: le format de j change en fonction de l'emplacement des étiquettes? Si tel est le cas, je pense que vous êtes coulé, car les éditeurs de liens ne sont pas assez intelligents pour faire ce genre de choses (le système de compilation ADA IIRC est peut-être plus intelligent que la plupart des autres, vous pouvez donc le consulter.)

Je m'attendrais à une entrée par adresse pour chaque instruction nécessitant une relocalisation.

Objdump pourra peut-être afficher la table de relocalisation d'un fichier exécutable ou objet, mais je ne connais pas les indicateurs à l'avance.

Je vous suggère d'essayer de déterrer une instruction x86 (ou une autre instruction CISC) faisant quelque chose de similaire à ce que fait votre client, et de voir quels déplacements ont été générés lorsque vous l'assemblez / le liez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top