11

是否可以强制 gcc 对所有系统调用使用int指令,而不是sysenter?这个问题可能听起来很奇怪,但我必须以这种方式编译一些项目,如 Python 和 Firefox。

概括

感谢 jbcreix,我已经下载了 glibc 2.9 源代码,并修改了 sysdeps/unix/sysv/linux/i386/sysdep.h 中的行,以禁用 sysenter 的使用#undef I386_USE_SYSENTER,并且它可以工作。

4

2 回答 2

2

sysenter替换为int 0x80insyscall.s并再次链接后重新编译您的 C 库。

这不是编译器生成的代码,这意味着你很幸运。

正如 OP 所说,实际系统调用的最终来源在这里:

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

而且我怀疑确实有一个 syscall.S 只是 glibc 源是一个迷宫。

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

所以我认为他是对的,asveikau。

于 2010-01-26T04:13:08.893 回答
2

你不修改 gcc;您修改 libc(或更准确地说,重新编译它)和内核。gcc 不发出 sysenter 指令;它生成对通用 syscall(2) 接口的调用,该接口为系统调用的进入和退出提供了一个统一的前端。

或者,您可以使用 Pentium;SYSENTER 直到 PII =] 才被引入。请注意以下关于 Linux 使用的有趣方法的 KernelTrap 链接:http: //kerneltrap.org/node/531

于 2010-01-26T03:32:43.627 回答