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