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)