如何强制gcc使用int进行系统调用,而不是sysenter?

时间:2010-01-25 08:44:22

标签: c gcc compiler-construction system-calls

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

摘要

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

2 个答案:

答案 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