是否可以强制gcc使用 int 指令进行所有系统调用,而不是 sysenter ?这个问题可能听起来很奇怪,但我必须以这种方式编译Python和Firefox等一些项目。
摘要
感谢jbcreix,我已经下载了glibc 2.9源代码,并修改了sysdeps / unix / sysv / linux / i386 / sysdep.h中的行,以禁用#undef I386_USE_SYSENTER
对sysenter的使用,它有效
答案 0 :(得分:2)
在sysenter
中将int 80
替换为syscall.s
之后重新编译您的C库,然后再次链接。
这不是编译器生成的代码,这意味着你很幸运。
实际系统调用的最终起源就在这里,正如OP所说:
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
所以我认为他做得对,asveikau。
答案 1 :(得分:1)
你不修改gcc;你修改libc(或更准确地说,重新编译它)和内核。 gcc不会发出sysenter指令;它生成对通用syscall(2)接口的调用,该接口为系统调用进入和退出提供统一的前端。
或者,你可以使用奔腾;直到PII =]才引入SYSENTER。请注意Linux使用的有趣方法的以下KernelTrap链接:http://kerneltrap.org/node/531