none
DLL のエクスポート情報について RRS feed

  • 質問

  • あるオープンソースソフトウェアをビルドする際に生じた問題について調べていて気付いたのですが、
    dll によっては、dumpbin /exports で表示される情報に違いがあることに気がつきました。

    たとえば、Microsoft の Visual C++ ランタイム(msvcp90.dll)であれば、

    1    0 0003DEAC ??$?5DU?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAD@Z = ??$?5DU?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAD@Z (class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::operator>><char,struct std::char_traits<char> >(class std::basic_istream<char,struct std::char_traits<char> > &,char &))

    といった状態で表示されますが、

    一部の dll (マイクロソフトのランタイムということでなく、広く一般的に)では、この情報の = 以降の情報がなく、この例でいえばただ単に

    1    0 0003DEAC ??$?5DU?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAD@Z

    となっているものがあります。

    この違いはおそらくリンカかなにかのオプションの違いによるものだと思うのですが、プロジェクトの設定を比較してみても
    その違いがわかりませんでした(気付けなかっただけか)。

    この出力される情報に違いが生じる理由とその違いによって具体的にプログラムを使用するうえで生じる違いを知っている方がいましたら教えて下さい。

    2011年10月17日 1:24

回答

  • やっとわかりました。

    C> dumpbin /pdbpath:verbose "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll"
    Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
    Copyright (C) Microsoft Corporation.  All rights reserved.


    Dump of file C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll

    File Type: DLL
      PDB ファイルの 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.i386.pdb' がチェックされました。(File not found)
      PDB ファイルの 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\msvcp100.i386.pdb' がチェックされました。(File not found)
      PDB ファイルが 'C:\Windows\symbols\dll\msvcp100.i386.pdb' で見つかりました。

      Summary
            4000 .data
            6000 .reloc
            1000 .rsrc
           5D000 .text

    単にPDBファイルがインストールされているというだけのようです。

    • 回答としてマーク SweetSmile 2011年10月18日 4:06
    2011年10月18日 2:56
  •   (1) 公開された関数名称=DLL内部での修飾済みの関数名称(その関数の定義)
    または、
      (2) 公開された関数名称=ILT(Import Lookup Table)からのオフセットアドレス
         (DLL内部での修飾済みの関数名称)

    ですね。掲載された例は(1)です。
    C++の場合、実行モジュール内部での関数名称はその所属や引数型等を材料に
    修飾されています(mangleとかmanglingなどと言われます)。
    一般には「=以下」を使用することはできませんので、それを気にする必要はありません。
    また、「=以下」の出力内容はdumpbin.exeのバージョンによって異なる場合があります。
    尚、「公開された関数名称」を自分で指定したい場合は「モジュール定義ファイル = *.def」を
    リンカが使用する様指定し、その中のEXPORTS 文に指定します。



    2011年10月17日 7:43

すべての返信

  •   (1) 公開された関数名称=DLL内部での修飾済みの関数名称(その関数の定義)
    または、
      (2) 公開された関数名称=ILT(Import Lookup Table)からのオフセットアドレス
         (DLL内部での修飾済みの関数名称)

    ですね。掲載された例は(1)です。
    C++の場合、実行モジュール内部での関数名称はその所属や引数型等を材料に
    修飾されています(mangleとかmanglingなどと言われます)。
    一般には「=以下」を使用することはできませんので、それを気にする必要はありません。
    また、「=以下」の出力内容はdumpbin.exeのバージョンによって異なる場合があります。
    尚、「公開された関数名称」を自分で指定したい場合は「モジュール定義ファイル = *.def」を
    リンカが使用する様指定し、その中のEXPORTS 文に指定します。



    2011年10月17日 7:43
  • 仲澤さん

    実際のところどちらであれ、リンクしdllの関数などを利用できるのであれば
    たしかに気にする必要はないんですけど、でもやっぱり気になってしまいますね。

    ちなみに、

    = 以降の非修飾名も含む文字列が入らない例が、ICU (http://site.icu-project.org/)  で、

    = 以降の非修飾名も含めた文字列が入る例が Xerces C++ ( http://xerces.apache.org/xerces-c/ ) です。

    どちらも、Visual C++ 2010 Express という同じ環境でのビルドですが違いが出ます。

    暇を見つけてもうちょっと調べてみます。

    2011年10月18日 2:19
  • やっとわかりました。

    C> dumpbin /pdbpath:verbose "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll"
    Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
    Copyright (C) Microsoft Corporation.  All rights reserved.


    Dump of file C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dll

    File Type: DLL
      PDB ファイルの 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.i386.pdb' がチェックされました。(File not found)
      PDB ファイルの 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\msvcp100.i386.pdb' がチェックされました。(File not found)
      PDB ファイルが 'C:\Windows\symbols\dll\msvcp100.i386.pdb' で見つかりました。

      Summary
            4000 .data
            6000 .reloc
            1000 .rsrc
           5D000 .text

    単にPDBファイルがインストールされているというだけのようです。

    • 回答としてマーク SweetSmile 2011年10月18日 4:06
    2011年10月18日 2:56
  • おおおおおおおおおお!!!

    pdb を消して dumpbin したらそれまで表示されていたものがでなくなりました。

    そんなことだったんですね。すごくすっきりしました。

    お時間取っていただきありがとうございました。

    2011年10月18日 4:06