【问题标题】:How to force gcc use int for system calls, not sysenter?如何强制 gcc 使用 int 进行系统调用,而不是 sysenter?
【发布时间】:2011-01-09 00:29:47
【问题描述】:

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

总结

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

【问题讨论】:

  • 简单,在 syscall.s 中用 int 80 替换 sysenter 后重新编译你的 C 库并再次链接。这不是编译器生成的代码,这意味着你很幸运。
  • @jbcreix 谢谢。您能否将其发布为答案,以便我接受答案?

标签: c gcc compiler-construction system-calls


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    syscall.s 中将sysenter 替换为int 0x80 后重新编译您的C 库并重新链接。

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

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

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

    而且我怀疑确实存在系统调用。S 只是 glibc 源是一个迷宫。

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

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

    【讨论】:

    • 我认为这些天“int 80h”或“sysenter”来自linux-gate.so,它被内核映射到一个神奇的页面。至少在 x86 上。
    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2012-11-02
    • 2017-10-09
    • 2012-08-17
    相关资源
    最近更新 更多