2012-06-25 2 views
3

Linux의 clone 함수를 LD_PRELOAD하려고합니다. 내 LD_PRELOADed 버전에서는 원래 clone 함수를 호출하기 전에 입력 매개 변수를 기록해야합니다. 그러나 문제는 clone이 가변 개수의 인수를 취한다는 것입니다. 그것은 이렇게 선언됩니다.복제 함수의 가변 인수 수 계산

이제
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... 
/* pid_t *pid, struct user_desc *tls, pid_t *ctid */); 

내가 그렇게 할 수있는 방법. 내가 전달 된 인수의 수를 알고 있어야합니다, 원래 clone 기능이 인수를 전달하는 방법?

+0

그래도 LD_PRELOAD 코드 (또는 적어도 일부 골격)가 있습니까? 이후 나는 똑같은 일을하려고하고 또한 clone() varags에 붙어있다. * va_ *의 구현에 기반하여 수용된 대답을 나열하면 스택에있는 데이터를 그냥 먹어 버릴 것이라고 생각합니다. 호출자는 항상 호출 수신자에게 사용할 인수 (종료 자, 형식 문자열 또는 sth 수)를 알려야합니다. – fiction

답변

1

NULL 종결자가있는 경우 을 호출 할 수 있지만 NULL은 반환하지 않습니다.

int clone(int (*fn)(void *), void *child_stack, int flags, 
      void *arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *" ctid "); 

참고 : :이 man page

2

va_* 함수를 사용하면 가변 인수 목록을 사용하여 작업 할 수 있습니다.

여기에 man page도 있으며 끝 부분에 예제가 있습니다.

0

는 프로토 타입을 설명 내가 tlspid_t 사이에 쉼표를 추가, 내가 매뉴얼 페이지에 오타가 있다고 생각.

그런 다음 인수 ptidctid에 대해 이야기합니다. 그래서 나는 문서를 점검하고 추가 인수가 정의 된 경우에는 va_list에서 읽는 방법입니다.

1

정답은 다음과 같습니다. 가변 인수 기능에서 인수의 수를 셀 수 없습니다. 특정 플래그가 특정 추가 인수가 필요로

그러나, clone 기능을 위해 당신은 flags 인수보고에게 인수의 수를 가정 할 수 있습니다. 이 내용의 manual page에서 예제 CLONE_PARENT_SETTID 플래그

걸릴 : 부모와 자식 메모리에 위치 측점 번호에서

스토어 아이 thread ID. (리눅스 2.5.32-2.5.48에서 이런 짓을 플래그 CLONE_SETTID 있었다.)이 플래그가 설정되어있는 경우

그래서 당신은 ptid 인수가 있어야 알고, 당신이 얻을 수있는 va_* 기능을 사용할 수 있습니다 그것.

그러나 사용자가 실제로 인수를 통과했는지 확인하는 방법은 없습니다. 즉 사용자가 물건을 끔찍하게 잘못 읽을 수없는 경우를 의미합니다.

+0

그래서 CLONE_PARENT_SETTID가 설정되면 ptid를 가정하고 하나의 인수를 먹을 수 있습니다. CLONE_SETTLS 또한 tls를 기대할 수 있고 스택에서 2 개의 인수를 읽을 수 있으며 CLONE_CHILD_CLEARTID 또는 CLONE_CHILD_SETTID가 설정되면 3 개의 인수를 기대할 수 있습니까?이 클론()은 끔찍한 hackish입니다. – fiction