type DynTag int
const (
- DT_NULL DynTag = 0; /* Terminating entry. */
- DT_NEEDED DynTag = 1; /* String table offset of a needed shared library. */
- DT_PLTRELSZ DynTag = 2; /* Total size in bytes of PLT relocations. */
- DT_PLTGOT DynTag = 3; /* Processor-dependent address. */
- DT_HASH DynTag = 4; /* Address of symbol hash table. */
- DT_STRTAB DynTag = 5; /* Address of string table. */
- DT_SYMTAB DynTag = 6; /* Address of symbol table. */
- DT_RELA DynTag = 7; /* Address of ElfNN_Rela relocations. */
- DT_RELASZ DynTag = 8; /* Total size of ElfNN_Rela relocations. */
- DT_RELAENT DynTag = 9; /* Size of each ElfNN_Rela relocation entry. */
- DT_STRSZ DynTag = 10; /* Size of string table. */
- DT_SYMENT DynTag = 11; /* Size of each symbol table entry. */
- DT_INIT DynTag = 12; /* Address of initialization function. */
- DT_FINI DynTag = 13; /* Address of finalization function. */
- DT_SONAME DynTag = 14; /* String table offset of shared object name. */
- DT_RPATH DynTag = 15; /* String table offset of library path. [sup] */
- DT_SYMBOLIC DynTag = 16; /* Indicates "symbolic" linking. [sup] */
- DT_REL DynTag = 17; /* Address of ElfNN_Rel relocations. */
- DT_RELSZ DynTag = 18; /* Total size of ElfNN_Rel relocations. */
- DT_RELENT DynTag = 19; /* Size of each ElfNN_Rel relocation. */
- DT_PLTREL DynTag = 20; /* Type of relocation used for PLT. */
- DT_DEBUG DynTag = 21; /* Reserved (not used). */
- DT_TEXTREL DynTag = 22; /* Indicates there may be relocations in non-writable segments. [sup] */
- DT_JMPREL DynTag = 23; /* Address of PLT relocations. */
- DT_BIND_NOW DynTag = 24; /* [sup] */
- DT_INIT_ARRAY DynTag = 25; /* Address of the array of pointers to initialization functions */
- DT_FINI_ARRAY DynTag = 26; /* Address of the array of pointers to termination functions */
- DT_INIT_ARRAYSZ DynTag = 27; /* Size in bytes of the array of initialization functions. */
- DT_FINI_ARRAYSZ DynTag = 28; /* Size in bytes of the array of terminationfunctions. */
- DT_RUNPATH DynTag = 29; /* String table offset of a null-terminated library search path string. */
- DT_FLAGS DynTag = 30; /* Object specific flag values. */
- DT_ENCODING DynTag = 32; /* Values greater than or equal to DT_ENCODING
- and less than DT_LOOS follow the rules for
- the interpretation of the d_un union
- as follows: even == 'd_ptr', even == 'd_val'
- or none */
+ DT_NULL DynTag = 0; /* Terminating entry. */
+ DT_NEEDED DynTag = 1; /* String table offset of a needed shared library. */
+ DT_PLTRELSZ DynTag = 2; /* Total size in bytes of PLT relocations. */
+ DT_PLTGOT DynTag = 3; /* Processor-dependent address. */
+ DT_HASH DynTag = 4; /* Address of symbol hash table. */
+ DT_STRTAB DynTag = 5; /* Address of string table. */
+ DT_SYMTAB DynTag = 6; /* Address of symbol table. */
+ DT_RELA DynTag = 7; /* Address of ElfNN_Rela relocations. */
+ DT_RELASZ DynTag = 8; /* Total size of ElfNN_Rela relocations. */
+ DT_RELAENT DynTag = 9; /* Size of each ElfNN_Rela relocation entry. */
+ DT_STRSZ DynTag = 10; /* Size of string table. */
+ DT_SYMENT DynTag = 11; /* Size of each symbol table entry. */
+ DT_INIT DynTag = 12; /* Address of initialization function. */
+ DT_FINI DynTag = 13; /* Address of finalization function. */
+ DT_SONAME DynTag = 14; /* String table offset of shared object name. */
+ DT_RPATH DynTag = 15; /* String table offset of library path. [sup] */
+ DT_SYMBOLIC DynTag = 16; /* Indicates "symbolic" linking. [sup] */
+ DT_REL DynTag = 17; /* Address of ElfNN_Rel relocations. */
+ DT_RELSZ DynTag = 18; /* Total size of ElfNN_Rel relocations. */
+ DT_RELENT DynTag = 19; /* Size of each ElfNN_Rel relocation. */
+ DT_PLTREL DynTag = 20; /* Type of relocation used for PLT. */
+ DT_DEBUG DynTag = 21; /* Reserved (not used). */
+ DT_TEXTREL DynTag = 22; /* Indicates there may be relocations in non-writable segments. [sup] */
+ DT_JMPREL DynTag = 23; /* Address of PLT relocations. */
+ DT_BIND_NOW DynTag = 24; /* [sup] */
+ DT_INIT_ARRAY DynTag = 25; /* Address of the array of pointers to initialization functions */
+ DT_FINI_ARRAY DynTag = 26; /* Address of the array of pointers to termination functions */
+ DT_INIT_ARRAYSZ DynTag = 27; /* Size in bytes of the array of initialization functions. */
+ DT_FINI_ARRAYSZ DynTag = 28; /* Size in bytes of the array of terminationfunctions. */
+ DT_RUNPATH DynTag = 29; /* String table offset of a null-terminated library search path string. */
+ DT_FLAGS DynTag = 30; /* Object specific flag values. */
+ DT_ENCODING DynTag = 32; /* Values greater than or equal to DT_ENCODING
+ and less than DT_LOOS follow the rules for
+ the interpretation of the d_un union
+ as follows: even == 'd_ptr', even == 'd_val'
+ or none */
DT_PREINIT_ARRAY DynTag = 32; /* Address of the array of pointers to pre-initialization functions. */
DT_PREINIT_ARRAYSZ DynTag = 33; /* Size in bytes of the array of pre-initialization functions. */
DT_LOOS DynTag = 0x6000000d; /* First OS-specific */
const (
DF_ORIGIN DynFlag = 0x0001; /* Indicates that the object being loaded may
- make reference to the $ORIGIN substitution
- string */
+ make reference to the $ORIGIN substitution
+ string */
DF_SYMBOLIC DynFlag = 0x0002; /* Indicates "symbolic" linking. */
DF_TEXTREL DynFlag = 0x0004; /* Indicates there may be relocations in
- non-writable segments. */
+ non-writable segments. */
DF_BIND_NOW DynFlag = 0x0008; /* Indicates that the dynamic linker should
- process all relocations for the object
- containing this entry before transferring
- control to the program. */
+ process all relocations for the object
+ containing this entry before transferring
+ control to the program. */
DF_STATIC_TLS DynFlag = 0x0010; /* Indicates that the shared object or
- executable contains code using a static
- thread-local storage scheme. */
+ executable contains code using a static
+ thread-local storage scheme. */
)
var dflagStrings = []intName{
* ELF32 Section header.
*/
type Section32 struct {
- Name uint32; /* Section name (index into the
- section header string table). */
+ Name uint32; /* Section name (index into the
+ section header string table). */
Type uint32; /* Section type. */
Flags uint32; /* Section flags. */
Addr uint32; /* Address in memory image. */
*/
type Section64 struct {
- Name uint32; /* Section name (index into the
- section header string table). */
+ Name uint32; /* Section name (index into the
+ section header string table). */
Type uint32; /* Section type. */
Flags uint64; /* Section flags. */
Addr uint64; /* Address in memory image. */
// A File represents an open Mach-O file.
type File struct {
FileHeader;
- ByteOrder binary.ByteOrder;
- Loads []Load;
- Sections []*Section;
+ ByteOrder binary.ByteOrder;
+ Loads []Load;
+ Sections []*Section;
- closer io.Closer;
+ closer io.Closer;
}
// A Load represents any Mach-O load command.
type Load interface {
- Raw() []byte
+ Raw() []byte;
}
// A LoadBytes is the uninterpreted bytes of a Mach-O load command.
type LoadBytes []byte
func (b LoadBytes) Raw() []byte {
- return b
+ return b;
}
// A SegmentHeader is the header for a Mach-O 32-bit or 64-bit load segment command.
type SegmentHeader struct {
- Cmd LoadCmd;
- Len uint32;
- Name string;
- Addr uint64;
- Memsz uint64;
- Offset uint64;
- Filesz uint64;
- Maxprot uint32;
- Prot uint32;
- Nsect uint32;
- Flag uint32;
+ Cmd LoadCmd;
+ Len uint32;
+ Name string;
+ Addr uint64;
+ Memsz uint64;
+ Offset uint64;
+ Filesz uint64;
+ Maxprot uint32;
+ Prot uint32;
+ Nsect uint32;
+ Flag uint32;
}
// A Segment represents a Mach-O 32-bit or 64-bit load segment command.
// Open() to avoid fighting over the seek offset
// with other clients.
io.ReaderAt;
- sr *io.SectionReader;
+ sr *io.SectionReader;
}
// Data reads and returns the contents of the segment.
// Open() to avoid fighting over the seek offset
// with other clients.
io.ReaderAt;
- sr *io.SectionReader;
+ sr *io.SectionReader;
}
// Data reads and returns the contents of the Mach-O section.
*/
type FormatError struct {
- off int64;
- msg string;
- val interface{};
+ off int64;
+ msg string;
+ val interface{};
}
func (e *FormatError) String() string {
}
f.Sections = new;
}
- f.Sections = f.Sections[0:n+1];
+ f.Sections = f.Sections[0 : n+1];
f.Sections[n] = sh;
sh.sr = io.NewSectionReader(r, int64(sh.Offset), int64(sh.Size));
sh.ReaderAt = sh.sr;
func cstring(b []byte) string {
var i int;
- for i=0; i<len(b) && b[i] != 0; i++ {
+ for i = 0; i < len(b) && b[i] != 0; i++ {
}
return string(b[0:i]);
}
type amd64Regs struct {
syscall.PtraceRegs;
- setter func (*syscall.PtraceRegs) os.Error;
+ setter func(*syscall.PtraceRegs) os.Error;
}
-var names = [...]string {
+var names = [...]string{
"rax",
"rbx",
"rcx",
func (r *amd64Regs) Get(i int) Word {
switch i {
- case 0: return Word(r.Rax);
- case 1: return Word(r.Rbx);
- case 2: return Word(r.Rcx);
- case 3: return Word(r.Rdx);
- case 4: return Word(r.Rsi);
- case 5: return Word(r.Rdi);
- case 6: return Word(r.Rbp);
- case 7: return Word(r.Rsp);
- case 8: return Word(r.R8);
- case 9: return Word(r.R9);
- case 10: return Word(r.R10);
- case 11: return Word(r.R11);
- case 12: return Word(r.R12);
- case 13: return Word(r.R13);
- case 14: return Word(r.R14);
- case 15: return Word(r.R15);
- case 16: return Word(r.Rip);
- case 17: return Word(r.Eflags);
- case 18: return Word(r.Cs);
- case 19: return Word(r.Ss);
- case 20: return Word(r.Ds);
- case 21: return Word(r.Es);
- case 22: return Word(r.Fs);
- case 23: return Word(r.Gs);
+ case 0:
+ return Word(r.Rax);
+ case 1:
+ return Word(r.Rbx);
+ case 2:
+ return Word(r.Rcx);
+ case 3:
+ return Word(r.Rdx);
+ case 4:
+ return Word(r.Rsi);
+ case 5:
+ return Word(r.Rdi);
+ case 6:
+ return Word(r.Rbp);
+ case 7:
+ return Word(r.Rsp);
+ case 8:
+ return Word(r.R8);
+ case 9:
+ return Word(r.R9);
+ case 10:
+ return Word(r.R10);
+ case 11:
+ return Word(r.R11);
+ case 12:
+ return Word(r.R12);
+ case 13:
+ return Word(r.R13);
+ case 14:
+ return Word(r.R14);
+ case 15:
+ return Word(r.R15);
+ case 16:
+ return Word(r.Rip);
+ case 17:
+ return Word(r.Eflags);
+ case 18:
+ return Word(r.Cs);
+ case 19:
+ return Word(r.Ss);
+ case 20:
+ return Word(r.Ds);
+ case 21:
+ return Word(r.Es);
+ case 22:
+ return Word(r.Fs);
+ case 23:
+ return Word(r.Gs);
}
panic("invalid register index ", strconv.Itoa(i));
}
func (r *amd64Regs) Set(i int, val Word) os.Error {
switch i {
- case 0: r.Rax = uint64(val);
- case 1: r.Rbx = uint64(val);
- case 2: r.Rcx = uint64(val);
- case 3: r.Rdx = uint64(val);
- case 4: r.Rsi = uint64(val);
- case 5: r.Rdi = uint64(val);
- case 6: r.Rbp = uint64(val);
- case 7: r.Rsp = uint64(val);
- case 8: r.R8 = uint64(val);
- case 9: r.R9 = uint64(val);
- case 10: r.R10 = uint64(val);
- case 11: r.R11 = uint64(val);
- case 12: r.R12 = uint64(val);
- case 13: r.R13 = uint64(val);
- case 14: r.R14 = uint64(val);
- case 15: r.R15 = uint64(val);
- case 16: r.Rip = uint64(val);
- case 17: r.Eflags = uint64(val);
- case 18: r.Cs = uint64(val);
- case 19: r.Ss = uint64(val);
- case 20: r.Ds = uint64(val);
- case 21: r.Es = uint64(val);
- case 22: r.Fs = uint64(val);
- case 23: r.Gs = uint64(val);
+ case 0:
+ r.Rax = uint64(val);
+ case 1:
+ r.Rbx = uint64(val);
+ case 2:
+ r.Rcx = uint64(val);
+ case 3:
+ r.Rdx = uint64(val);
+ case 4:
+ r.Rsi = uint64(val);
+ case 5:
+ r.Rdi = uint64(val);
+ case 6:
+ r.Rbp = uint64(val);
+ case 7:
+ r.Rsp = uint64(val);
+ case 8:
+ r.R8 = uint64(val);
+ case 9:
+ r.R9 = uint64(val);
+ case 10:
+ r.R10 = uint64(val);
+ case 11:
+ r.R11 = uint64(val);
+ case 12:
+ r.R12 = uint64(val);
+ case 13:
+ r.R13 = uint64(val);
+ case 14:
+ r.R14 = uint64(val);
+ case 15:
+ r.R15 = uint64(val);
+ case 16:
+ r.Rip = uint64(val);
+ case 17:
+ r.Eflags = uint64(val);
+ case 18:
+ r.Cs = uint64(val);
+ case 19:
+ r.Ss = uint64(val);
+ case 20:
+ r.Ds = uint64(val);
+ case 21:
+ r.Es = uint64(val);
+ case 22:
+ r.Fs = uint64(val);
+ case 23:
+ r.Gs = uint64(val);
default:
panic("invalid register index ", strconv.Itoa(i));
}
return r.setter(&r.PtraceRegs);
}
-func newRegs(regs *syscall.PtraceRegs, setter func (*syscall.PtraceRegs) os.Error) Regs {
+func newRegs(regs *syscall.PtraceRegs, setter func(*syscall.PtraceRegs) os.Error) Regs {
res := amd64Regs{};
res.PtraceRegs = *regs;
res.setter = setter;