DLL의 암시적/명시적 사용에 따른 동작의 차이

munamuna의 이미지

안녕하세요.

오늘 개발도중에 좀 알수없는 문제가 발견되서 조언 부탁드립니다.

서버팀에서 제가 새롭게 인수인계를 받기 일주일전에 만든 MyDll.lib과 dll을 가지고 오늘 실행 파일을 만들었습니다.

그 실행파일을 가지고 제가 오늘 새롭게 만든 MyDll.lib과 dll(사용되지 않는 함수를 제거했습니다 / 사용되는 함수는 외형이 동일하지만 내부적 처리가 대폭 바뀌었습니다)을 가지고 프그램을 기동시켰습니다.

OS의 차가 있을지 없을지는 모르겠지만.. OS는 Windows 2003입니다.

서버팀의 실행 파일은 정적(암시적 연결)으로 MyDll.lib을 사용하고 있습니다.

(1) 이 경우 서버팀에서 만든 실행파일은 정상적으로 움직이게 되는 것인가요?
즉, 구 라이브러리를 가지고 컴파일한 실행 파일은 새로운 라이브러리와 함께 동작시켜도 잘 돌아가게 되나요?

(2) (1)번이 정상적으로 움직이지 않는다면 동적(명시적)연결을 했을 경우 잘 움직이게 되는 것인가요?

(3) 정적(암시적)으로 하면 정상적이지 않고, 동적(명시적)으로 하면 정상 이라면...

제 예상인데요..

동적(명시적) 연결시에는 DLL의 진입점을 찾아와 사용하므로 lib가 어떻게 바뀌던지 상관 없는것 같습니다.

정적(암시적) 연결시에는 lib을 보고, 함수 진입점 어드레스를 미리 취득해서 사용하게 되는다고 생각됩니다만..

제 생각이 맞는 것인지요?

책이랑 인터넷을 아무리 뒤져봐도 검색어가 마땅치 않아서 인지 속시원히 알지를 못하겠습니다.

부디 조언좀 부탁드립니다. 5시간째 정말 머리 깨지겠습니다.

추가로 dllMain에서 CoInitialize(), CoUninitialize()를 하고있는데.. 별 문제 없는 것이지요?

그럼.. 부탁드립니다.. __);

JuEUS-U의 이미지

제가 아는 수준에서만 얘길 하자면
DLL 내의 함수의 순서만 동일하다면 (중간에 끼어들거나 펑크나는거 없이)
DLL의 내용이 바뀌어도 괜찮습니다.

DLL 주소 테이블에 엑세스를 해서
함수 주소를 획득,
그리고 사용,
이런 식으로 되기 때문에 말입죠 =ω=);;

---- 추가 ----
아아,, 그 프로그램들이 컴파일될때 Bind됐으면 불가능합니다.
컴파일시에 주소값을 프로그램에 하드코딩 시키는 거지요...

mauri의 이미지

이건 저도 이렇지 않을까~ 라는 생각은 했었습니다.

어디 자세한 설명나온곳 없을려나 모르겠네요.. ㅎㅎ

mg2000의 이미지

그게 DLL을 쓰는 이유중 하나인데, DLL바꿨다고, DLL을 호출하는 모듈도 재컴파일해야 한다 싶으면,

쓸 이유가 없죠.

그렇게 된다면, 윈도우 서비스팩 나온다면, 윈도우용 프로그램 전부 재컴파일 해야겠죠.

munamuna의 이미지

먼저.. 답글 달아주신 분들 모두 관심가져주셔서 감사합니다.

mg2000님//그렇다면 명시적/암시적 연결에 차이가 없다는 말씀이신가요? 암시적 연결시 LIB가 필요한 이유는 무엇인가요?

체스맨의 이미지

export 방법에 따라 다릅니다. 과거 16비트 윈도의 경우, 암시적 연결시에는 ordinal 로 export 하는 방법 밖에 없었으므로, export 된 함수의 순서를 지키는 일이 매우 중요했습니다. 그래서 module definition file ( .def ) 를 사용했지요.

이 잔재가 여전히 남아있고, ordinal 로 export 된 경우는 여전히 export 된 함수 순서가 중요합니다. 그래서 export 방식을 어떻게 했는가에 따라, 함수 몇 개를 제거해서 함수 순서가 바뀌었다면 엉뚱한 함수가 호출될 수도 있습니다. 단, ordinal 로 링크되는 경우 로딩 속도가 조금 빠를 수 있습니다.

반면 __declspec(export) 를 사용하여 이름으로 export 하는 경우는 이러한 문제가 없습니다. 전통적으로 unix 계열의 공유 라이브러리들은 이름으로 export 하는 방식을 취하고 있습니다.

윈도에서 DLL 을 링크시키기 위해 임포트 라이브러리 ( .lib) 이 필요한 이유는 위 문제와 별개인데, 윈도 DLL 포맷이 이 링커에 필요한 정보를 가지고 있지 않기 때문입니다. 반면 unix 계열 공유 라이브러리는 대개 링커에 필요한 정보를 공유 라이브러리 안에 모두 가지고 있구요.

Orion Project : http://orionids.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.