collect rebase symbols
This commit is contained in:
parent
9b2796b2a1
commit
04979b0afd
@ -27,6 +27,9 @@ type ImportSymbol struct {
|
|||||||
file_address uint64
|
file_address uint64
|
||||||
lib_ordinal uint32
|
lib_ordinal uint32
|
||||||
|
|
||||||
|
target uint32
|
||||||
|
high8 uint32
|
||||||
|
|
||||||
// push number
|
// push number
|
||||||
pnum uint32
|
pnum uint32
|
||||||
stub uint64
|
stub uint64
|
||||||
@ -122,8 +125,9 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
if status == 3 {
|
if status == 3 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// fmt.Printf("segment=%x format=%x page_count=%d\n", fix.segment, fix.format, fix.page_count)
|
|
||||||
// fmt.Printf("pages=%x\n", fix.pages)
|
fmt.Printf("segment=%x format=%x page_count=%d\n", fix.segment, fix.format, fix.page_count)
|
||||||
|
|
||||||
pages := ([]C.ushort)(unsafe.Slice(fix.pages, fix.page_count))
|
pages := ([]C.ushort)(unsafe.Slice(fix.pages, fix.page_count))
|
||||||
reader := bytes.NewReader(mc.buf)
|
reader := bytes.NewReader(mc.buf)
|
||||||
for page_i := 0; page_i < int(fix.page_count); page_i++ {
|
for page_i := 0; page_i < int(fix.page_count); page_i++ {
|
||||||
@ -132,6 +136,8 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
address := int64(fix.segment) + int64(page_i) * int64(fix.page_size) + int64(pages[page_i])
|
address := int64(fix.segment) + int64(page_i) * int64(fix.page_size) + int64(pages[page_i])
|
||||||
reader.Seek(address, io.SeekStart)
|
reader.Seek(address, io.SeekStart)
|
||||||
|
|
||||||
|
fmt.Printf(" page %d offset=%x\n", page_i, address)
|
||||||
|
|
||||||
code := make([]byte, 8)
|
code := make([]byte, 8)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@ -141,6 +147,10 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
var bind C.int
|
var bind C.int
|
||||||
var ret1 C.ulonglong
|
var ret1 C.ulonglong
|
||||||
var ret2 C.ulonglong
|
var ret2 C.ulonglong
|
||||||
|
if (fix.format != 2 && fix.format != 6) {
|
||||||
|
fmt.Printf("format is %d\n", fix.format)
|
||||||
|
}
|
||||||
|
|
||||||
next := C.ParseFixValue(C.int(fix.format), C.ulonglong(v),
|
next := C.ParseFixValue(C.int(fix.format), C.ulonglong(v),
|
||||||
&bind, &ret1, &ret2)
|
&bind, &ret1, &ret2)
|
||||||
|
|
||||||
@ -164,6 +174,14 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
syms = append(syms, &new_sym)
|
syms = append(syms, &new_sym)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("// 0x%x rebase=%d target=0x%x high8=0x%x\n", address, bind, ret1, ret2)
|
fmt.Printf("// 0x%x rebase=%d target=0x%x high8=0x%x\n", address, bind, ret1, ret2)
|
||||||
|
sym.typ = "rebase"
|
||||||
|
sym.target = uint32(ret1)
|
||||||
|
sym.high8 = uint32(ret2)
|
||||||
|
sym.segment = uint32(mc.findSegmentIndexAt(uint64(address)))
|
||||||
|
sym.file_address = uint64(address)
|
||||||
|
sym.next = int(next)
|
||||||
|
new_sym := sym
|
||||||
|
syms = append(syms, &new_sym)
|
||||||
}
|
}
|
||||||
|
|
||||||
if int(next) == 0 {
|
if int(next) == 0 {
|
||||||
@ -176,6 +194,7 @@ func (mc *MachoContext) CollectBindSymbolsModern() []*ImportSymbol {
|
|||||||
reader.Seek(0, io.SeekStart)
|
reader.Seek(0, io.SeekStart)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fmt.Printf("number of imports %d\n", len(syms))
|
||||||
return syms
|
return syms
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user