> mais tu te trompes pour l'adressage relatif qui ne serait pas utilisable entre fonctions.
Pour tout les appels de fonction de librarie partagé, le relatif ne peut pas marché.
> Quoique finalement ça ne devrait pas être très difficile de faire un compilateur qui serait capable de suivre les offset des pointeurs de fonction...
Faut ajouter beaucoup de code pour ça => perte de place. C'est comme les gens qui veulent économiser de l'espace en utilisant des champs bits. Faut tellement de code, que généralement ça bouffe plus de place que d'utiliser un int pour stocker un booleen. Et c'est aussi plus lent.
> Par contre, n'importe quel appel de fonction "normal" marche très bien avec des offset relatifs, c'est ce qu'il se passe quand tu génères du code "PIC"
En fait, lorsque la librairie partagée est chargée, le loader change toute les adresses relatives en absolu (depuis la table des symbols). Car ce sont des adresses relatives (donc de 64 bits sur un OS 64 bits) et non des offsets. Les librairies partagées sont faites en considérant qu'elle commence à l'adresse 0 (la résolution d'adresse sera faite à l'excécution). Il est claire que si plusieurs librairie sont utilisées, ça ne peut pas marché. Le loader va modifier les adresses relatives pour en faire des adresses absolus.
[^] # Re: Position d'Intel sur les processeurs 64 bits grand public
Posté par matiasf . En réponse à la dépêche Position d'Intel sur les processeurs 64 bits grand public. Évalué à 1.
Pour tout les appels de fonction de librarie partagé, le relatif ne peut pas marché.
> Quoique finalement ça ne devrait pas être très difficile de faire un compilateur qui serait capable de suivre les offset des pointeurs de fonction...
Faut ajouter beaucoup de code pour ça => perte de place. C'est comme les gens qui veulent économiser de l'espace en utilisant des champs bits. Faut tellement de code, que généralement ça bouffe plus de place que d'utiliser un int pour stocker un booleen. Et c'est aussi plus lent.
> Par contre, n'importe quel appel de fonction "normal" marche très bien avec des offset relatifs, c'est ce qu'il se passe quand tu génères du code "PIC"
En fait, lorsque la librairie partagée est chargée, le loader change toute les adresses relatives en absolu (depuis la table des symbols). Car ce sont des adresses relatives (donc de 64 bits sur un OS 64 bits) et non des offsets. Les librairies partagées sont faites en considérant qu'elle commence à l'adresse 0 (la résolution d'adresse sera faite à l'excécution). Il est claire que si plusieurs librairie sont utilisées, ça ne peut pas marché. Le loader va modifier les adresses relatives pour en faire des adresses absolus.