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

问题描述 投票:0回答:2

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

总结

感谢jbcreix,我下载了glibc 2.9源代码,并修改了sysdeps/unix/sysv/linux/i386/sysdep.h中的行,以禁用

#undef I386_USE_SYSENTER
使用sysenter,并且它有效。

c gcc system-calls
2个回答
2
投票

sysenter
中将
int 0x80
替换为
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。


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.