[질문]DSO에 대해서...

stoneshim의 이미지

프로그램의 확장을 위해서 사용되는 DSO가 점차 사용이 많이 되는것으로 보이는데요...- 대표적으로 Apache에서 사용되는 것으로 알고 있습니다 - 이에 대해 몇가지 궁금한 점이 있습니다.

dlopen() 호출 시에 유닉스 로더가 라이브러리가 제공하는 심볼을 찾아 매핑한다는것은 어느정도 이해가 가는데... 문제는 라이브러리에서 실행파일의 심볼을 역으로 찾아가는것이 상식적으로 잘 이해가 되질 않습니다.
(1)어떠한 방식으로 - 실행파일 내에 있는 함수 선언시 특별한 방식을 택해야 하는것인지 - DSO 라이브러리 에서 실행파일의 심볼을 찾아갈 수 있는지 궁금합니다.

이러한 역 매핑( 용어가 맞는지는 모르겠습니다 )을 지원하는 것이 표준이 아닌것으로 알고 있는데요.
(2)지원되는 플랫폼과 안되는 플랫폼이 어떤것이 있는지 궁금합니다.
일단 리눅스에서는 지원하는것으로 알고 있구요... Solaris나 HPUX 등은???

윈도우 쪽은 잘 모르지만 일견 dlopen() / dlsym() 방식은 윈도우의 dll 개념과 비슷하지 않나 싶은데요...
(3) 이에 대한 의견이 있으시면 좀 부탁드립니다.
그리고 혹시 윈도우의 dll에서도 dll 내의 함수에서 exe 내부의 함수를 호출할 수 있는지 궁금하네요.

환절기에 건강 조심하십시요.

see2002의 이미지

솔라리스에서도 지원됩니다. HP-UX는 모르겠군요...
gcc를 쓸 수 있는 플랫폼이라면 DSO라이브러리도 쓸수있는거 아닌가요...?

그리고, 제가 알기론 DSO 라이브러리가 C언어 환경을 중점으로 만들어진거라
C++언어 환경에서는 사용하려면 제약이 있는걸로압니다....(Windows플랫폼의 dll에 비해서.....)
자세한건 kldp에 dlopen()/dlsym()관련 문서에 자세히 나왔을듯하네요...

익명 사용자의 이미지

stoneshim wrote:
dlopen() 호출 시에 유닉스 로더가 라이브러리가 제공하는 심볼을 찾아 매핑한다는것은 어느정도 이해가 가는데... 문제는 라이브러리에서 실행파일의 심볼을 역으로 찾아가는것이 상식적으로 잘 이해가 되질 않습니다.
(1)어떠한 방식으로 - 실행파일 내에 있는 함수 선언시 특별한 방식을 택해야 하는것인지 - DSO 라이브러리 에서 실행파일의 심볼을 찾아갈 수 있는지 궁금합니다.

ELF 바이너리 파일안에 보면 전역 심볼에 대한 해쉬값을 기록해 놓은 표가 있습니다. 거기서 탐색을 해보면 찾고자 하는 심볼의 주소를 알 수 있습니다.

Quote:
이러한 역 매핑( 용어가 맞는지는 모르겠습니다 )을 지원하는 것이 표준이 아닌것으로 알고 있는데요.

역 매핑은 아니고 그냥 매핑이라고 합니다. 그리고 표준입니다.

Quote:
(2)지원되는 플랫폼과 안되는 플랫폼이 어떤것이 있는지 궁금합니다.
일단 리눅스에서는 지원하는것으로 알고 있구요... Solaris나 HPUX 등은???

솔라리스, HP/UX 등 요즘 나오는 유닉스들은 전부 지원합니다.

Quote:
윈도우 쪽은 잘 모르지만 일견 dlopen() / dlsym() 방식은 윈도우의 dll 개념과 비슷하지 않나 싶은데요...

개념적으로는 비슷하지만 구체적인 방법은 아주 다릅니다. 윈도 dll은 심볼을 수출하는 표가 있어서 거기서 찾습니다.

Quote:
그리고 혹시 윈도우의 dll에서도 dll 내의 함수에서 exe 내부의 함수를 호출할 수 있는지 궁금하네요.

수출표를 갖고 있는 dll은 GetProcAddress같은 함수를 쓰면 되니까 쉽지만, exe는 보통 수출표를 갖고 있지 않으므로 일반적인 방법으로는 안됩니다(함수 이름이나 일련번호를 모르기 때문에). 그런데 dll에서 exe내의 함수를 호출하는 일은 모두 콜백으로 구현 가능하지 않나요?
stoneshim의 이미지

답변 감사합니다.

제 표현이 정확하지 않았던것 같습니다.

일단 제가 이해한 내용을 말씀드리겠습니다. 이 부분에서 잘못된 부분이 있으면 지적해주시길~~~

실행파일 링크 시 -l 옵션으로 공유라이브러리를 지정한 경우는 실행파일이 실행될 때 library loader가 지정된 라이브러리를 로드후 재배치작업을 함으로써 실행파일내의 해석되지 않은 symbol을 라이브러리의 symbol주소와 연결시킨다.

실행파일이 dlopen() 을 사용하여 라이브러리를 동적으로 로드 하는 경우에 library loader가 해당 라이브러리를 로드한 후 dlsym()이 호출될때 라이브러리의 symbol table 에서 해당 symbol의 찾아주어 연결이 된다.

여기까지가 제가 이해하는 내용입니다.

잘 모르겠는 것은 라이브러리에서 실행파일의 함수를 호출하는 경우인데요.
library loader가 재배치 작업을 할 때 라이브러리 안에 있는 해석되지 않은 symbol을 실행파일의 symbol 주소와 연결 시켜주느냐의 문제인데.. 이게 잘 되는 모양이죠? ( 제가 처음 생각했을때는 안해주지 않을까? 뭐 그랬습니다. 껄껄~~ )

그리고...이러한 방식이 library loader의 종류에 관계없이 공통적으로 적용 가능한 것인지 궁금합니다.( GNU 쪽의 loader가 아니라도 그런지... )

또 하나는 실행파일을 컴파일 할때 --export-dynamic 옵션에 대한건데요. 이 옵션이 어떤 경우에 필요한지... 어떻게 기능하는지... 궁금합니다.

답변 해주신 분들께 다시한번 감사드립니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

익명 사용자의 이미지

stoneshim wrote:
답변 감사합니다.

제 표현이 정확하지 않았던것 같습니다.


아니오, 제가 질문을 잘못 이해했습니다. 8)

Quote:
잘 모르겠는 것은 라이브러리에서 실행파일의 함수를 호출하는 경우인데요.

라이브러리에서 실행파일의 함수를 일반적인 방법으로 호출하는 것은 간단히 말씀드리면 불가능합니다. 왜냐하면 실행파일은 라이브러리보다 거의 대부분 나중에 만들어지기 때문에 무슨 심볼이 어떻게 존재하는지 라이브러리로서는 알 길이 없기 때문입니다. 따라서 라이브러리를 로드한 다음 초기화 함수를 불러낼 때 콜백 함수(에 대한 포인터)를 인수로 넘겨주면 그걸 통해 라이브러리에서 실행 파일내 함수를 호출합니다.

Quote:
library loader가 재배치 작업을 할 때 라이브러리 안에 있는 해석되지 않은 symbol을 실행파일의 symbol 주소와 연결 시켜주느냐의 문제인데.. 이게 잘 되는 모양이죠? ( 제가 처음 생각했을때는 안해주지 않을까? 뭐 그랬습니다. 껄껄~~ )

말씀하신 것을 resolution이라고 하는데, 그와 같은 경우는 불가능합니다. 왜냐하면 라이브러리를 컴파일할 때 컴파일러가 새 심볼을 만나면 이게 미래의 실행 파일에 나올 심볼인지 프로그래머가 실수로 잘못 쓴 것인지 구분할 길이 없기 때문입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.