Как заставить gcc использовать int для системных вызовов, а не sysenter? - PullRequest
11 голосов
/ 25 января 2010

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

Основная информация

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

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Перекомпилируйте свою библиотеку C после замены sysenter на int 80 в syscall.s и снова создайте ссылку.

Это не сгенерированный компилятором код, который означает, что вам повезло.

Окончательное происхождение фактического системного вызова здесь, как говорит ОП:

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

И, как я подозревал, действительно был системный вызов. Просто источники glibc - это лабиринт.

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

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

1 голос
/ 26 января 2010

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

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

...