gnuのbinutilsおよびmsvcのutils使用


gnuのbinutilsの使用
object fileは大体executable(a.out)、reallocable(.o)、dynamic library(.so)のいくつかで、ELF形式を例にとると、1つのELF形式は多くのsectionに分けられ、その中で点の先頭の文字列で命名されたsectionはすべて約束俗成のいくつかの特殊なsectionである.
 
binutilsのreadelfは、ELFファイルを比較的簡単に分析することができます.-aパラメータは、すべてのクエリー可能な結果、すなわち--file-header、--program-headers、--sections、--symbols、--relocs、--dynamic、--notes、--version-infoのいくつかのパラメータの組み合わせをリストします.その中の--sectionsはこのELFの中のすべてのsectionをリストすることができて、その他の前の3項を除いて、基本的にいくつかの特殊なsectionに対応しています.
 
ELFのsectionとプロセスメモリのsegmentは、1つのsegmentが複数のsection(およびsection以外のコンテンツ)を含む可能性があり、1つのsectionが複数のsegmentにマッピングされる可能性があるという2つの概念であることに注意してください.
ELFファイルはプログラムヘッダを使用して、ELFミラーリングのプロセスをexec()に指示し、各LOADタイプの`--program-headers`は、segmentを生成する方法を直接指導します.
 
私たちがよく話しているシンボルテーブルは、2つの特殊なsection、すなわち.Symtabと.dynsym、つまりreadelfに対応する--dynamicオプション(両方出力);binutilsのstripコマンドは.Symtabが乾く;それでsoでは基本的に提供する.dynsymは呼び出し用です.
readelfに加えてobjdump(アセンブリコードをリストできるのが特長)も可能であり、binutils中のnmがより可能である(これを専門にする).nmデフォルト出力Symtab,nm-D出力.dynsymですが、個人的にはnmの3つの出力フォーマットはreadelfの直感的ではありません.
『C++のlibはコンパイラにまたがるものではない』では、MingW移植objdumpを使用してPEファイルのシンボルテーブルを表示した.
 
readelfの--dynamicがリストされます.dynamicセグメントの情報はlddのraw結果に相当する.
 
msvcのutils使用
PEファイルとELFファイルには親縁関係があり,いずれも初期のCOFFファイルフォーマットから発展した.
 
dllからdefタイプlibを生成するには:dumpbin /exports C:\yourpath\yourlib.dll > mylib.def
vim mylib.defは関数名のみを保持し、ファイルヘッダにEXPORTSを1行追加します.lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib
  dumpbin /headers xxx.dll
出力の一番手前のFile Header部分では、x 86かx 64のPEファイルかがわかります.