2010-01-25 3 views
11

은 모든 시스템 호출을위한 GCC 사용을 INT 명령을 강제 할 수 있지만하지 sysenter? 이 질문은 이상하게 들릴지 모르지만 파이썬과 파이어 폭스 같은 프로젝트를 이런 식으로 컴파일해야합니다.gcc가 시스템 호출이 아닌 시스템 호출에 강제로 사용하는 방법은 무엇입니까?

덕분에 jbcreix하는 요약, 나는 #undef I386_USE_SYSENTER에 의해 sysenter을 사용하지 않으려면,/유닉스/SYSV/리눅스/I386/sysdep.h의 glibc 2.9 소스 코드를 다운로드하고, sysdeps에 라인을 수정 한 , 그리고 그것은 작동합니다.

당신은 GCC를 수정하지 않는
+3

쉽게 다시 syscall.s 및 링크 INT (80)에 의해 sysenter를 교체 한 후 C 라이브러리를 컴파일. 이것은 컴파일러가 생성 한 코드가 아니기 때문에 운이 좋습니다. – jbcreix

+0

@jbcreix 감사합니다. 대답을 게시하여 답변을 수락 할 수 있습니까? – ZelluX

답변

2

다시 syscall.s 및 링크 int 80에 의해 sysenter를 교체 한 후 C 라이브러리를 컴파일.

이 운이 의미 코드를 생성 컴파일러되지 않습니다.

실제 콜의 궁극적 인 기원은 영업 이익이 말한대로, 여기에 있습니다 :

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

을 내가 의심으로 정말 glibc는 소스가 미로입니다 단지의 syscall.S 있었다.

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

그래서 나는 그가 바로 asveikau 그것을 거 같아요.

+0

나는 요즘 "INT의 80H"또는 "sysenter"는 커널에 의해 마법의 페이지에 매핑되는 linux-gate.so에서 오는 것으로 생각했다. 적어도 x86에서. – asveikau

1

; libc를 수정 (또는보다 정확하게 재 컴파일)하고 커널을 수정하십시오. gcc는 sysenter 명령어를 방출하지 않습니다. 시스템 콜 입력과 종료에 대한 통일 된 프론트 엔드를 제공하는 일반적인 syscall (2) 인터페이스에 대한 호출을 생성합니다.

또는, 펜티엄을 사용할 수 있습니다; SYSENTER는 PII =가 될 때까지 도입되지 않았습니다. 리눅스에서 사용하는 재미있는 방법에 대해 다음 KernelTrap 링크를 참고 : http://kerneltrap.org/node/531

관련 문제