Как заставить gcc использовать int для системных вызовов, а не sysenter?

Можно ли заставить gcc использовать команду int для всех системных вызовов, но не sysenter? Этот вопрос может показаться странным, но я должен скомпилировать такие проекты, как Python и Firefox.

Резюме

Благодаря jbcreix я загрузил исходный код glibc 2.9 и изменил строки в sysdeps/unix/sysv/linux/i386/sysdep.h, чтобы отключить использование sysenter на #undef I386_USE_SYSENTER, и он работает.

Ответ 1

Скомпилируйте свою библиотеку 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

Итак, я думаю, что он правильно понял, авейкау.

Ответ 2

Вы не изменяете gcc; вы изменяете libc (или, точнее, перекомпилируете его) и ядро. gcc не испускает инструкции sysenter; он генерирует вызовы на общий интерфейс syscall (2), который представляет собой унифицированный интерфейс для входа и выхода системного вызова.

Или вы могли бы использовать Pentium; SYSENTER не вводился до PII =]. Обратите внимание на следующую ссылку KernelTrap для интересных методов, используемых Linux: http://kerneltrap.org/node/531