[질문]DSO에 대해서...
글쓴이: stoneshim / 작성시간: 금, 2003/03/07 - 4:25오후
프로그램의 확장을 위해서 사용되는 DSO가 점차 사용이 많이 되는것으로 보이는데요...- 대표적으로 Apache에서 사용되는 것으로 알고 있습니다 - 이에 대해 몇가지 궁금한 점이 있습니다.
dlopen() 호출 시에 유닉스 로더가 라이브러리가 제공하는 심볼을 찾아 매핑한다는것은 어느정도 이해가 가는데... 문제는 라이브러리에서 실행파일의 심볼을 역으로 찾아가는것이 상식적으로 잘 이해가 되질 않습니다.
(1)어떠한 방식으로 - 실행파일 내에 있는 함수 선언시 특별한 방식을 택해야 하는것인지 - DSO 라이브러리 에서 실행파일의 심볼을 찾아갈 수 있는지 궁금합니다.
이러한 역 매핑( 용어가 맞는지는 모르겠습니다 )을 지원하는 것이 표준이 아닌것으로 알고 있는데요.
(2)지원되는 플랫폼과 안되는 플랫폼이 어떤것이 있는지 궁금합니다.
일단 리눅스에서는 지원하는것으로 알고 있구요... Solaris나 HPUX 등은???
윈도우 쪽은 잘 모르지만 일견 dlopen() / dlsym() 방식은 윈도우의 dll 개념과 비슷하지 않나 싶은데요...
(3) 이에 대한 의견이 있으시면 좀 부탁드립니다.
그리고 혹시 윈도우의 dll에서도 dll 내의 함수에서 exe 내부의 함수를 호출할 수 있는지 궁금하네요.
환절기에 건강 조심하십시요.
Forums:
솔라리스에서도 지원됩니다. HP-UX는 모르겠군요...gcc를 쓸 수
솔라리스에서도 지원됩니다. HP-UX는 모르겠군요...
gcc를 쓸 수 있는 플랫폼이라면 DSO라이브러리도 쓸수있는거 아닌가요...?
그리고, 제가 알기론 DSO 라이브러리가 C언어 환경을 중점으로 만들어진거라
C++언어 환경에서는 사용하려면 제약이 있는걸로압니다....(Windows플랫폼의 dll에 비해서.....)
자세한건 kldp에 dlopen()/dlsym()관련 문서에 자세히 나왔을듯하네요...
Re: [질문]DSO에 대해서...
ELF 바이너리 파일안에 보면 전역 심볼에 대한 해쉬값을 기록해 놓은 표가 있습니다. 거기서 탐색을 해보면 찾고자 하는 심볼의 주소를 알 수 있습니다.
역 매핑은 아니고 그냥 매핑이라고 합니다. 그리고 표준입니다.
솔라리스, HP/UX 등 요즘 나오는 유닉스들은 전부 지원합니다.
개념적으로는 비슷하지만 구체적인 방법은 아주 다릅니다. 윈도 dll은 심볼을 수출하는 표가 있어서 거기서 찾습니다.
수출표를 갖고 있는 dll은 GetProcAddress같은 함수를 쓰면 되니까 쉽지만, exe는 보통 수출표를 갖고 있지 않으므로 일반적인 방법으로는 안됩니다(함수 이름이나 일련번호를 모르기 때문에). 그런데 dll에서 exe내의 함수를 호출하는 일은 모두 콜백으로 구현 가능하지 않나요?
답변 감사합니다.제 표현이 정확하지 않았던것 같습니다.일단
답변 감사합니다.
제 표현이 정확하지 않았던것 같습니다.
일단 제가 이해한 내용을 말씀드리겠습니다. 이 부분에서 잘못된 부분이 있으면 지적해주시길~~~
실행파일 링크 시 -l 옵션으로 공유라이브러리를 지정한 경우는 실행파일이 실행될 때 library loader가 지정된 라이브러리를 로드후 재배치작업을 함으로써 실행파일내의 해석되지 않은 symbol을 라이브러리의 symbol주소와 연결시킨다.
실행파일이 dlopen() 을 사용하여 라이브러리를 동적으로 로드 하는 경우에 library loader가 해당 라이브러리를 로드한 후 dlsym()이 호출될때 라이브러리의 symbol table 에서 해당 symbol의 찾아주어 연결이 된다.
여기까지가 제가 이해하는 내용입니다.
잘 모르겠는 것은 라이브러리에서 실행파일의 함수를 호출하는 경우인데요.
library loader가 재배치 작업을 할 때 라이브러리 안에 있는 해석되지 않은 symbol을 실행파일의 symbol 주소와 연결 시켜주느냐의 문제인데.. 이게 잘 되는 모양이죠? ( 제가 처음 생각했을때는 안해주지 않을까? 뭐 그랬습니다. 껄껄~~ )
그리고...이러한 방식이 library loader의 종류에 관계없이 공통적으로 적용 가능한 것인지 궁금합니다.( GNU 쪽의 loader가 아니라도 그런지... )
또 하나는 실행파일을 컴파일 할때 --export-dynamic 옵션에 대한건데요. 이 옵션이 어떤 경우에 필요한지... 어떻게 기능하는지... 궁금합니다.
답변 해주신 분들께 다시한번 감사드립니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
[quote="stoneshim"]답변 감사합니다.제 표현이 정확
아니오, 제가 질문을 잘못 이해했습니다. 8)
라이브러리에서 실행파일의 함수를 일반적인 방법으로 호출하는 것은 간단히 말씀드리면 불가능합니다. 왜냐하면 실행파일은 라이브러리보다 거의 대부분 나중에 만들어지기 때문에 무슨 심볼이 어떻게 존재하는지 라이브러리로서는 알 길이 없기 때문입니다. 따라서 라이브러리를 로드한 다음 초기화 함수를 불러낼 때 콜백 함수(에 대한 포인터)를 인수로 넘겨주면 그걸 통해 라이브러리에서 실행 파일내 함수를 호출합니다.
말씀하신 것을 resolution이라고 하는데, 그와 같은 경우는 불가능합니다. 왜냐하면 라이브러리를 컴파일할 때 컴파일러가 새 심볼을 만나면 이게 미래의 실행 파일에 나올 심볼인지 프로그래머가 실수로 잘못 쓴 것인지 구분할 길이 없기 때문입니다.
댓글 달기