package pe
import (
"encoding/binary"
"fmt"
"internal/saferio"
"io"
"strconv"
)
type SectionHeader32 struct {
Name [8 ]uint8
VirtualSize uint32
VirtualAddress uint32
SizeOfRawData uint32
PointerToRawData uint32
PointerToRelocations uint32
PointerToLineNumbers uint32
NumberOfRelocations uint16
NumberOfLineNumbers uint16
Characteristics uint32
}
func (sh *SectionHeader32 ) fullName (st StringTable ) (string , error ) {
if sh .Name [0 ] != '/' {
return cstring (sh .Name [:]), nil
}
i , err := strconv .Atoi (cstring (sh .Name [1 :]))
if err != nil {
return "" , err
}
return st .String (uint32 (i ))
}
type Reloc struct {
VirtualAddress uint32
SymbolTableIndex uint32
Type uint16
}
func readRelocs(sh *SectionHeader , r io .ReadSeeker ) ([]Reloc , error ) {
if sh .NumberOfRelocations <= 0 {
return nil , nil
}
_ , err := r .Seek (int64 (sh .PointerToRelocations ), io .SeekStart )
if err != nil {
return nil , fmt .Errorf ("fail to seek to %q section relocations: %v" , sh .Name , err )
}
relocs := make ([]Reloc , sh .NumberOfRelocations )
err = binary .Read (r , binary .LittleEndian , relocs )
if err != nil {
return nil , fmt .Errorf ("fail to read section relocations: %v" , err )
}
return relocs , nil
}
type SectionHeader struct {
Name string
VirtualSize uint32
VirtualAddress uint32
Size uint32
Offset uint32
PointerToRelocations uint32
PointerToLineNumbers uint32
NumberOfRelocations uint16
NumberOfLineNumbers uint16
Characteristics uint32
}
type Section struct {
SectionHeader
Relocs []Reloc
io .ReaderAt
sr *io .SectionReader
}
func (s *Section ) Data () ([]byte , error ) {
return saferio .ReadDataAt (s .sr , uint64 (s .Size ), 0 )
}
func (s *Section ) Open () io .ReadSeeker {
return io .NewSectionReader (s .sr , 0 , 1 <<63 -1 )
}
const (
IMAGE_SCN_CNT_CODE = 0x00000020
IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040
IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080
IMAGE_SCN_LNK_COMDAT = 0x00001000
IMAGE_SCN_MEM_DISCARDABLE = 0x02000000
IMAGE_SCN_MEM_EXECUTE = 0x20000000
IMAGE_SCN_MEM_READ = 0x40000000
IMAGE_SCN_MEM_WRITE = 0x80000000
)
The pages are generated with Golds v0.7.0-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .