Как заставить gcc использовать int для системных вызовов, а не sysenter?
Можно ли заставить gcc использовать int инструкцию для всех системных вызовов, но не sysenter ? Этот вопрос может показаться странным, но я должен скомпилировать некоторые проекты, такие как Python и Firefox таким образом.
Резюме
Благодаря jbcreix я скачал исходный код glibc 2.9 и изменил строки в sysdeps/unix/sysv/linux/i386/sysdep.h, отключить использование sysenter с помощью #undef I386_USE_SYSENTER
, и это работает.
2 ответа:
Перекомпилируйте свою библиотеку C после замены
sysenter
наint 80
вsyscall.s
и снова свяжите.Это не код, сгенерированный компилятором, что означает, что вам повезло.
Конечное происхождение фактического syscall здесь, как говорит OP:
Http://cvs.savannah.gnu.org/viewvc/libc/sysdeps/unix/sysv/linux/i386/sysdep.h?root=libc&view=markup
И, как я и подозревал, там действительно был syscall.Это все равно, что в glibc источников являются лабиринт.
Http://cvs.savannah.gnu.org/viewvc/libc/sysdeps/unix/sysv/linux/i386/syscall.S?root=libc&view=markup
Так что я думаю, он все правильно понял, асвейкау.
Вы не изменяете gcc; вы изменяете libc (или, точнее, перекомпилируете его) и ядро. gcc не выдает инструкций sysenter; он генерирует вызовы к универсальному интерфейсу syscall (2), который представляет собой единый интерфейс для входа и выхода системного вызова.
Или вы можете использовать Pentium; SYSENTER не был введен до PII =]. Обратите внимание на следующую ссылку KernelTrap для интересных методов, используемых Linux: http://kerneltrap.org/node/531