Как заставить 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 11

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