프로세스에서 공유라이브러리 루틴을 사용하면(최초로 호출하면) ld-linuxxxx.so가 해당공유라이브러리를 메모리로 올린후(이미 메모리에 올라가있으면 생략..)에 이를 프로세스 주소공간과 맵핑시키게 된다.(맞죠??)
그럼 ld-linuxxxx.so또한 공유라이브러리이기 때문에 커널의 로더(exec()??) 루틴이 해당프로세스가 공유라이브러리를 사용하면 이 ld-linuxxxx.so를 메모리에 올린후(이미 메모리에 올라가 있으면 생략..) 해당 프로세스의 주소공간과 맵핑시키게 된다.
결국 이렇게 되는게 맞는거 같은데요..
그렇다면 ld-linuxxxx.so를 최초로 메모리에 적재하게 되는 경우는 어떻게 될까요??
궁금합니다..적절한 init시점에 해주는것인지 아니면 말그대로 최초로 공유라이브러리를 사용하는 프로세스를 로딩할때 해주게 되는것인지...??
그럼 ld-linuxxxx.so또한 공유라이브러리이기 때문에 커널의 로더(exec()??) 루틴이 해당프로세스가 공유라이브러리를 사용하면 이 ld-linuxxxx.so를 메모리에 올린후(이미 메모리에 올라가 있으면 생략..) 해당 프로세스의 주소공간과 맵핑시키게 된다.
결국 이렇게 되는게 맞는거 같은데요..
그렇다면 ld-linuxxxx.so를 최초로 메모리에 적재하게 되는 경우는 어떻게 될까요??
궁금합니다..적절한 init시점에 해주는것인지 아니면 말그대로 최초로 공유라이브러리를 사용하는 프로세스를 로딩할때 해주게 되는것인지...??
댓글 3
-
백창우
2008.04.08 01:44
-
백창우
2008.04.08 01:48
생각해보니 어차피 이 이상 내려가면 누군가 만들어 놓은 답은 없는것 같습니다. 직접 분석 해보는수 밖에는요. -
이수연
2008.04.08 03:25
프로세스를 로딩할때 해주는게 맞을 듯 합니다.
예를 들면 load_elf_binary() 코드를 보면 이런 부분이 있습니다.
...
retval = kernel_read(bprm->file, elf_ppnt->p_offset,
elf_interpreter,
elf_ppnt->p_filesz);
...
if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0)
ibcs2_interpreter = 1;
...
SET_PERSONALITY(loc->elf_ex, ibcs2_interpreter);
interpreter = open_exec(elf_interpreter);
retval = PTR_ERR(interpreter);
if (IS_ERR(interpreter))
goto out_free_interp;
.
그기까지는 아직 생각안해봤네요.
로딩된 ld-linux.so를 공유한다는 것과 ld-linux.so가 바이너리에서 필요한 공유 라이브러리를 맵핑해주는것 까지는 맞는데 그 이전에 상황은 모르겠네요.
한번 직접 찾아보시죠. 저도 제 호기심에 의해 일일이 디버거 돌려보고 까보고해서 찾아본 것이니 의문에 대한 답도 찾아보면 나올겁니다.