2011-07-12 2 views
3

私はELFとPE形式のオブジェクトファイル(学校/研究プロジェクトの一種)を分析することをプログラムに取り組んでいます。今、私は実行可能ファイルで動的インポートシンボルを処理しようとしています。私はできるだけ多くのシンボルについての情報を探したいと思っています。 PE形式で

は、輸入は.idata部に記憶されています。さまざまな情報を持つテーブルがいくつかありますが、興味深いのは、シンボルが定義されているライブラリを調べることに問題はないということです。共有ライブラリの名前とそれからインポートされたシンボルの名前/序数は常にあります。

私もELFファイルにこの種の情報を見つけるしたいと思います。すべてのインポート/エクスポートは.dynsymセクション(ダイナミックシンボルテーブル)にあります。インポートされたシンボルは、未定義とマークされます。

00000000  DF *UND* 00000000 GLIBC_2.0 fileno 

しかし、このシンボルのソースファイルは何もありません。すべての必要な共有ライブラリには、例えば、.dynamicのセクションに記載されています:シンボル内のライブラリに関する

Dynamic Section: 
    NEEDED    libz.so.1 

情報のみが、バージョン文字列= GLIBC_2.0です。私はこれを通じて本物のライブラリ名を取得する方法について考えていたが、私はobjdump -pの出力を見たとき、私はGLIBC_2.0が複数のライブラリーを用いて接続することができることを発見した:

Version References: 
    required from libm.so.6: 
    0x0d696910 0x00 13 GLIBC_2.0 
    required from libgcc_s.so.1: 
    0x0b792650 0x00 12 GLIBC_2.0 

私が正しくELFの動的リンクプロセスを理解していれば

、この情報をELF実行可能ファイルで見つけることはできません。どこからインポートされたシンボルは、すべてのシンボルテーブルをメモリにロードした後、リンカによって決定されます。 しかし、私は移動する前にこれについて確かめたいので、私の質問です:ELF実行可能ファイルからシンボル共有ライブラリの名前を見つける方法はありますか?

ありがとうございました。

答えて

0

数ヶ月前、私はかなり似たものを働いていた - 私はnmおよびreadelfがソースをつかんですべての私の質問に答えることができました。 (http://ftp.gnu.org/gnu/binutils/を参照してください) これも便利です - >http://www.skyfree.org/linux/references/ELF_Format.pdf

+0

さて、私はBFDのobjdumpのと少しの原因を調査しました。私はELF仕様を読んだ。それに基づいて、実際に動的にリンクされていない限り、ダイナミックシンボルテーブル内のシンボルにライブラリ名を割り当てることはできないと思います。しかし、私はそれについて絶対に確信しているとは言えません、私は私が上に移動する前に私より多くの経験を持っている人とそれを議論したいと思います。 –

+0

Ah - ok。私はあなたの元の質問を理解しているとは思わない。明確にするために、シンボルに基づいて、使用されているライブラリファイルを探したいと思いますか? Linuxでは、これはプログラムローダーによって行われます。シンボルはライブラリのキャッシュと一致します。ライブラリーが定義されており、そこから - 各インポートされたシンボルにライブラリの名前を割り当てることが可能である場合http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – Josh

+0

はい、私は不思議を参照してください。共有オブジェクトを実際にロードして検索することなく、実行可能ファイルのデータのみに基づいて動的リンク中にリンクされます。 –

0

Okですので、インポートされた各シンボルにライブラリ名を割り当てることはおそらく不可能です。しかし、私はSymbolのバージョン管理を通して解決策を見つけたかもしれません。もちろん、各ELFファイルにsybolバージョンのセクションが存在する必要はありません。

struct elf_obj_tdata *pElf = bfdFile->tdata.elf_obj_data; 
for (long i = 0; i < dynNumSyms; i++) 
{ 
    asymbol *dynSym = dynSymTab[i]; 

    // If there is version information in file. 
    if (pElf->dynversym_section != 0 
     && (pElf->dynverdef_section != 0 
     || pElf->dynverref_section != 0)) 
    { 
     unsigned int vernum; 
     const char *version_string; 
     const char *fileName; 

     vernum = ((elf_symbol_type *) dynSym)->version & VERSYM_VERSION; 

     if (vernum == 0) // local sym 
      version_string = ""; 
     else if (vernum == 1) // global sym, defined in this object 
      version_string = "Base"; 
     else if (vernum <= pElf->cverdefs) 
      version_string = pElf->verdef[vernum - 1].vd_nodename; 
     else 
    { 
     Elf_Internal_Verneed *t; 

     version_string = ""; 
     fileName = ""; 

     // Iterate through all Verneed entries - all libraries 
     for (t = pElf->verref; t != NULL; t = t->vn_nextref) 
     { 
      Elf_Internal_Vernaux *a; 

      // Iterate through all Vernaux entries 
      for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr) 
      { 
       // Find associated entry 
       if (a->vna_other == vernum) 
       { 
        version_string = a->vna_nodename; 
        fileName = t->vn_filename; 
        break; 
       } 
      } 
     } 

     // here we have got: 
     // name of symbol = dynSym->name 
     // version string = version_string 
     // name of library = fileName 
    } 
    } 
} 

これは正しいと思いますか?

+0

結局結論に達しましたか?はいの場合、それは何ですか?私はまったく同じ質問をしています... – stackoverflowwww

関連する問題