github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/debug/macho/file.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  /*
     6  machoパッケージは、Mach-Oオブジェクトファイルへのアクセスを実装します。
     7  
     8  # セキュリティ
     9  
    10  このパッケージは、敵対的な入力に対して強化されるように設計されていません、そして
    11  https://go.dev/security/policy の範囲外です。特に、オブジェクトファイルを解析する際には基本的な
    12  検証のみが行われます。そのため、信頼できない入力を解析する際には注意が必要です、なぜなら、
    13  不正なファイルを解析すると、大量のリソースを消費するか、パニックを引き起こす可能性があります。
    14  */
    15  package macho
    16  
    17  import (
    18  	"github.com/shogo82148/std/debug/dwarf"
    19  	"github.com/shogo82148/std/encoding/binary"
    20  	"github.com/shogo82148/std/io"
    21  )
    22  
    23  // Fileは、開かれたMach-Oファイルを表します。
    24  type File struct {
    25  	FileHeader
    26  	ByteOrder binary.ByteOrder
    27  	Loads     []Load
    28  	Sections  []*Section
    29  
    30  	Symtab   *Symtab
    31  	Dysymtab *Dysymtab
    32  
    33  	closer io.Closer
    34  }
    35  
    36  // Loadは、任意のMach-Oロードコマンドを表します。
    37  type Load interface {
    38  	Raw() []byte
    39  }
    40  
    41  // LoadBytesは、Mach-Oロードコマンドの解釈されていないバイトを表します。
    42  type LoadBytes []byte
    43  
    44  func (b LoadBytes) Raw() []byte
    45  
    46  // SegmentHeaderは、Mach-O 32ビットまたは64ビットのロードセグメントコマンドのヘッダーです。
    47  type SegmentHeader struct {
    48  	Cmd     LoadCmd
    49  	Len     uint32
    50  	Name    string
    51  	Addr    uint64
    52  	Memsz   uint64
    53  	Offset  uint64
    54  	Filesz  uint64
    55  	Maxprot uint32
    56  	Prot    uint32
    57  	Nsect   uint32
    58  	Flag    uint32
    59  }
    60  
    61  // Segmentは、Mach-O 32ビットまたは64ビットのロードセグメントコマンドを表します。
    62  type Segment struct {
    63  	LoadBytes
    64  	SegmentHeader
    65  
    66  	// ReadAtメソッドのためにReaderAtを埋め込みます。
    67  	// ReadとSeekを避けるために、SectionReaderを直接埋め込まないでください。
    68  	// クライアントがReadとSeekを使用したい場合は、
    69  	// 他のクライアントとのシークオフセットの競合を避けるために
    70  	// Open()を使用する必要があります。
    71  	io.ReaderAt
    72  	sr *io.SectionReader
    73  }
    74  
    75  // Dataはセグメントの内容を読み取り、返します。
    76  func (s *Segment) Data() ([]byte, error)
    77  
    78  // Openは、セグメントを読み取る新しいReadSeekerを返します。
    79  func (s *Segment) Open() io.ReadSeeker
    80  
    81  type SectionHeader struct {
    82  	Name   string
    83  	Seg    string
    84  	Addr   uint64
    85  	Size   uint64
    86  	Offset uint32
    87  	Align  uint32
    88  	Reloff uint32
    89  	Nreloc uint32
    90  	Flags  uint32
    91  }
    92  
    93  // Relocは、Mach-Oの再配置を表します。
    94  type Reloc struct {
    95  	Addr  uint32
    96  	Value uint32
    97  	// Scattered == false かつ Extern == true の場合、Valueはシンボル番号です。
    98  	// Scattered == false かつ Extern == false の場合、Valueはセクション番号です。
    99  	// Scattered == true の場合、Valueはこの再配置が参照する値です。
   100  	Type      uint8
   101  	Len       uint8
   102  	Pcrel     bool
   103  	Extern    bool
   104  	Scattered bool
   105  }
   106  
   107  type Section struct {
   108  	SectionHeader
   109  	Relocs []Reloc
   110  
   111  	// ReadAtメソッドのためにReaderAtを埋め込みます。
   112  	// ReadとSeekを避けるために、SectionReaderを直接埋め込まないでください。
   113  	// クライアントがReadとSeekを使用したい場合は、
   114  	// 他のクライアントとのシークオフセットの競合を避けるために
   115  	// Open()を使用する必要があります。
   116  	io.ReaderAt
   117  	sr *io.SectionReader
   118  }
   119  
   120  // Dataは、Mach-Oセクションの内容を読み取り、返します。
   121  func (s *Section) Data() ([]byte, error)
   122  
   123  // Openは、Mach-Oセクションを読み取る新しいReadSeekerを返します。
   124  func (s *Section) Open() io.ReadSeeker
   125  
   126  // Dylibは、Mach-Oの動的ライブラリロードコマンドを表します。
   127  type Dylib struct {
   128  	LoadBytes
   129  	Name           string
   130  	Time           uint32
   131  	CurrentVersion uint32
   132  	CompatVersion  uint32
   133  }
   134  
   135  // Symtabは、Mach-Oのシンボルテーブルコマンドを表します。
   136  type Symtab struct {
   137  	LoadBytes
   138  	SymtabCmd
   139  	Syms []Symbol
   140  }
   141  
   142  // A Dysymtab represents a Mach-O dynamic symbol table command.
   143  type Dysymtab struct {
   144  	LoadBytes
   145  	DysymtabCmd
   146  	IndirectSyms []uint32
   147  }
   148  
   149  // Rpathは、Mach-O rpathコマンドを表します。
   150  type Rpath struct {
   151  	LoadBytes
   152  	Path string
   153  }
   154  
   155  // Symbolは、Mach-O 32ビットまたは64ビットのシンボルテーブルエントリです。
   156  type Symbol struct {
   157  	Name  string
   158  	Type  uint8
   159  	Sect  uint8
   160  	Desc  uint16
   161  	Value uint64
   162  }
   163  
   164  // FormatErrorは、データがオブジェクトファイルの正しい形式でない場合、
   165  // 一部の操作によって返されます。
   166  type FormatError struct {
   167  	off int64
   168  	msg string
   169  	val any
   170  }
   171  
   172  func (e *FormatError) Error() string
   173  
   174  // Openは、[os.Open] を使用して指定されたファイルを開き、それをMach-Oバイナリとして使用するための準備をします。
   175  func Open(name string) (*File, error)
   176  
   177  // Closeは、[File] を閉じます。
   178  // [File] が [Open] ではなく [NewFile] を直接使用して作成された場合、
   179  // Closeは何も影響を与えません。
   180  func (f *File) Close() error
   181  
   182  // NewFileは、基礎となるリーダーでMach-Oバイナリにアクセスするための新しいFileを作成します。
   183  // Mach-Oバイナリは、ReaderAtの位置0で開始することが期待されています。
   184  func NewFile(r io.ReaderAt) (*File, error)
   185  
   186  // Segmentは、指定された名前の最初のSegmentを返します。そのようなセグメントが存在しない場合はnilを返します。
   187  func (f *File) Segment(name string) *Segment
   188  
   189  // Sectionは、指定された名前の最初のセクションを返します。そのような
   190  // セクションが存在しない場合はnilを返します。
   191  func (f *File) Section(name string) *Section
   192  
   193  // DWARFは、Mach-OファイルのDWARFデバッグ情報を返します。
   194  func (f *File) DWARF() (*dwarf.Data, error)
   195  
   196  // ImportedSymbolsは、バイナリfが参照しているすべてのシンボルの名前を返します。
   197  // これらは、動的ロード時に他のライブラリによって満たされることが期待されています。
   198  func (f *File) ImportedSymbols() ([]string, error)
   199  
   200  // ImportedLibrariesは、バイナリfが参照しているすべてのライブラリのパスを返します。
   201  // これらは、動的リンク時にバイナリとリンクされることが期待されています。
   202  func (f *File) ImportedLibraries() ([]string, error)