2010-01-25 2 views
11

Est-il possible de forcer gcc à utiliser int instruction pour tous les appels système, mais pas sysenter? Cette question peut sembler étrange mais je dois compiler certains projets comme Python et Firefox de cette façon.Comment forcer gcc à utiliser int pour les appels système, pas sysenter?

Résumé

Merci à jbcreix, je l'ai téléchargé glibc 2.9 code source et modifié les lignes sysdeps/unix/sysv/linux/i386/sysdep.h, de désactiver l'utilisation de sysenter par #undef I386_USE_SYSENTER , et il fonctionne.

+3

facile, recompilez votre bibliothèque C après avoir remplacé sysenter par int 80 dans syscall.s et reliez de nouveau. Ce code n'est pas généré par le compilateur, ce qui signifie que vous avez de la chance. – jbcreix

+0

@jbcreix Merci pour cela. Pourriez-vous l'afficher comme réponse afin que je puisse accepter la réponse? – ZelluX

Répondre

2

Recompiler votre bibliothèque C après avoir remplacé sysenter par int 80 dans syscall.s et un lien nouveau.

Ce code n'est pas généré par le compilateur, ce qui signifie que vous avez de la chance.

L'origine ultime de la syscall réelle est ici, comme l'OP dit:

http://cvs.savannah.gnu.org/viewvc/libc/sysdeps/unix/sysv/linux/i386/sysdep.h?root=libc&view=markup

Et comme je le soupçonnais il y avait vraiment un syscall.S il est juste que les sources de glibc sont un labyrinthe.

http://cvs.savannah.gnu.org/viewvc/libc/sysdeps/unix/sysv/linux/i386/syscall.S?root=libc&view=markup

Je pense qu'il a eu raison, asveikau.

+0

Je pensais que ces jours le "int 80h" ou "sysenter" vient de linux-gate.so qui est mappé à une page magique par le noyau. Au moins sur x86. – asveikau

1

Vous ne modifiez pas gcc; vous modifiez libc (ou plus exactement, recompilez-le) et le noyau. gcc n'émet pas d'instructions sysenter; il génère des appels à l'interface générique syscall (2), qui présente un frontal unifié à l'entrée et à la sortie de l'appel système.

Ou, vous pouvez utiliser un Pentium; SYSENTER n'a pas été introduit avant PII =]. Notez le lien suivant pour KernelTrap les méthodes intéressantes utilisées par Linux: http://kerneltrap.org/node/531

Questions connexes