2011-02-02 4 views
6

는 내가 fork() 시스템 호출을 오버로드 RTLD_NEXT를 사용하여 fork()의 내 자신의 버전을 만들었습니다. 즉, dlsym(RTLD_NEXT, fork)입니다. 이것은 포크의 내 버전을 칠 것입니다. 이 후 나는 실제 fork() 시스템 호출, 즉 자식 프로세스를 생성하고 pid를 반환하는 작업과 몇 가지 추가 기능을 복제하려고합니다.오버로드 포크()

는 그 작업을 수행하는 방법을 알아낼 수 없습니다입니다. fork() (fork.c)의 커널 소스 코드를 확인 했으므로 그다지 알 수 없었습니다.

이렇게 :

dlsym(RTLD_NEXT,fork); 
int fork(void) { 
    int pid=_fork(); // Trying to call actual fork does not work 
    return pid; 
} 

내가 어떻게 할 수 있습니까? (주석에서 가져온) http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10

편집 : 여기에 포크에 대한 소스 코드를 커널에 대한 링크입니다

나는 도구를 검출 누출 일하고, 그리고이 도구는 더블 무료 때 자식 프로세스를 감지 부모가 할당 한 메모리를 삭제합니다. 내가 fork() 우선합니다이를 극복하기 위해, 그리고 fork()이있을 때마다, 부모의 메모리 할당 테이블은 아이에게 중복됩니다.

+0

"작동하지 않음"이란 무엇을 의미합니까? 런타임 오류? 컴파일러 오류? – Simone

+0

@ Simone : _fork(); // 오류 : _fork가 선언되지 않았습니다. 내 생각은 실제 커널 버전의 fork와 충돌하지 않는 것이었다. 그것이 지금 분명하게되기를 바라 라. – kingsmasher1

+0

정확히 무엇을하고 싶습니까? 당신의 최종 목표는 무엇입니까? – Omnifarious

답변

3

syscall(SYS_fork)으로 fork<sys/syscall.h> 뒤에 넣어야합니다. syscall(2)을 참조하십시오.

+0

"포크 (fork)"시스템 호출이 더 이상 존재하지 않는다고 확신하지 못했습니다. 특정 매개 변수 집합을 사용하여 '복제'호출로 변환 된 것으로 생각했습니다. – Omnifarious

+0

@larsmans : 그건 좋은 생각이야 !! 큰. 지금 시도해보고 작동하는지 확인하겠습니다. – kingsmasher1

+0

@Omnifarious : 여전히 작동합니다. 거꾸로 compat, 나는 생각한다. –

7

당신은 fork을위한 커널 소스 코드에서 유용 아무것도 얻을하지 않을 수 있습니다. 당신이 관리하는 라이브러리 속임수에 상관없이 커널이하는 일을 코드에서 허용하지 않을 것입니다. 이는 커널 모듈을 작성하지 않고는 위반할 수없는 어려운 경계입니다.

fork에 대한 모든 라이브러리 코드가 설정되어 있고 커널의 fork 코드가 실행되는 커널 모드로 전환하는 특수 명령이 실행됩니다. 이 특별한 명령어를 자신의 코드에 넣는 방법이 있습니다. syscall 함수입니다. fork에는 인수가 없으므로이 함수를 사용하여 시스템 호출을 수행하는 것이 상대적으로 쉽습니다.

는하지만 이것은 내가 당신이 추천 것이 아니다. 난 당신이 대신이 작업을 수행하는 것이 좋습니다 : 당신이 라이브러리 해커를 공유 어떤

기본적으로
typedef int (*forkfunc_t)(void); 

int fork(void) 
{ 
    forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork"); 
    return sysfork(); 
} 

는, 당신은 기본적으로 자신과 당신이 그것을 교체하기 전에 fork 기능의 이전 값을 검색 할 수있는 방법을 찾아야한다.

+0

나는 누수 탐지 도구를 만들고 있는데,이 도구는 자식 프로세스가 부모에 의해 할당 된 메모리를 삭제할 때 double free를 감지한다. 이것을 극복하기 위해 나는 fork()를 오버라이드 할 것이고, fork()가있을 때마다 부모의 메모리 할당 테이블은 자식에게 복사 될 것이다. – kingsmasher1

+0

@ kingsmasher1 : 아, 커널이'fork'로 무엇을하고 있는지 수정할 필요가 없으므로, 커널을 가로 채서 적절히 포장해야합니다. 이것은 매우 효과적이며, 공유 라이브러리 기술은 그것에 대해 갈 길이 멀지 않습니다. – Omnifarious

+0

@ kingsmasher1 정보의 중요한 부분이므로 질문에 대한 귀하의 의견을 편집했습니다! 만족스럽지 않다면 편집하고 편집하십시오. –

0

당신이 심하게 해킹되어 있기 때문에, 어쨌든, 왜 그냥 사용하지 매크로

#define fork() (spoon(),fork()) 

또는 spoon 당신이 달성하고자하는 일을 기능은 다음이다

#define fork() spoon(fork()) 

.

는 전처리는 재귀을하고 혼자 expasion 내부의 fork을 남기지 않도록 보장된다.

+0

내 문제 fork()를 오버로드하는 방법이 아니 었습니다. 나는 "dlsym"sys 호출을 사용하여 오버로드 할 수있었습니다. 내 문제는 어떻게 포크()의 작품을 복제 어쨌든 난 larsman의 제안을 사용하여 내 문제를 해결할 수있게되었습니다. 어쨌든. – kingsmasher1