dlsym..에 관하여..
글쓴이: 지나가는새 / 작성시간: 월, 2003/02/17 - 5:16오후
이해할 수 없네요.. 쩝. 도움 부탁 합니다.
코드는 다음과 같습니다.
struct myStr* parse(char *str){ struct myStr* p; void * handle; char buf[10] ; handle = dlopen(str, RTLD_LAZY); // -> str(mylib.so)는 존재하지 않습니다. if(handle == NULL){ handle = dlopen(NULL, RTLD_LAZY); } // ---------------------- 1. strcpy(buf, "myLib"); // ---------- 2 p = dlsym(handle, buf); if(p == NULL) return -1; return p; } 프로그램 상에서는 p 리턴.
질문은요, 1번에서, dlopen(NULL,...)의 이유를 모르겠구요,
man dlsym 보면 dlopen으로 연 라이브러리에서 심볼의 어드레스를 리턴한다고 되어 있고, 값이 없으면 NULL을 리턴한다고 되어 있는데, 실제로는 값이 들어가 있습니다.
2번에서는 추측이지만, 라이브러리 상의 함수이름인가요?
이거 도통 갈피를 못잡겠네요..
두번째질문은.. 만약에 dlsym을 쓰지 못한다면 어떤식으로 심볼을 얻어야 할까요.. 단순히 포인터만 얻는것과 같은건지.. 아리까리 합니다.
도움 부탁 합니다.
Forums:
dlopen 에 처음 넣는 값은 file name이지만그 file이
dlopen 에 처음 넣는 값은 file name이지만
그 file이 없는 경우 dlopen이 실패하고
그 경우에는 현재 돌고 있는 process image에서 symbol을
구하고자 할때 dlopen의 처음 넣는 값을 null로 합니다.
심볼이란 대개 export 된 function이나 변수명입니다.
따라서 이 예제에서는 myLib 이라는 변수명 또는 함수명을 str 이라는 파일 또는 현재 process image에서 구할 수 있겠군요.
---
http://coolengineer.com
감사합니다.만약에 dlsym을 쓰지 않는다면 어떤방법으로 myLi
감사합니다.
만약에 dlsym을 쓰지 않는다면 어떤방법으로 myLib 을 얻을 수 있을까요..
도통 헷갈리네요..
프로세스 이미지에서 함수의 주소를 얻는다는것의 정확한 개념이 안잡히거든요..
도움 부탁 드리겠습니다.
Fever Pitch!
[quote="지나가는새"]감사합니다.만약에 dlsym을 쓰지 않
바이너리 파일 안에 보면 심볼명과 대응하는 주소를 적어둔 표가 있습니다. dlsym()이 하는 역할은 그 표에서 심볼명을 찾아 주소를 리턴하는 것이죠. dlsym을 쓰지 않는다면 그와 같은 기능을 직접 구현하면 됩니다(너무 당연한 얘기지만...쩝).
댓글 달기