Commit da4d740f authored by Marvin Stenger's avatar Marvin Stenger Committed by David Crawshaw

cmd/link/internal/loadmacho: reduce scope of local declarations

Move some local declarations closer to their use, reducing their
respective lifetimes, also improve few error messages.
Follow up of CL 67370.

Updates #22095

Change-Id: I6131159ae8de571015ef5459b33d5c186e543a37
Reviewed-on: https://go-review.googlesource.com/69110Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent eab5bc9a
......@@ -426,42 +426,19 @@ func macholoadsym(m *ldMachoObj, symtab *ldMachoSymtab) int {
// Load loads the Mach-O file pn from f.
// Symbols are written into syms, and a slice of the text symbols is returned.
func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) {
var j int
var is64 bool
var secaddr uint64
var hdr [7 * 4]uint8
var cmdp []byte
var dat []byte
var ncmd uint32
var cmdsz uint32
var ty uint32
var sz uint32
var off uint32
var m *ldMachoObj
var e binary.ByteOrder
var sect *ldMachoSect
var rel *ldMachoRel
var rpi int
var s *sym.Symbol
var s1 *sym.Symbol
var outer *sym.Symbol
var c *ldMachoCmd
var symtab *ldMachoSymtab
var dsymtab *ldMachoDysymtab
var r []sym.Reloc
var rp *sym.Reloc
var name string
errorf := func(str string, args ...interface{}) ([]*sym.Symbol, error) {
return nil, fmt.Errorf("loadmacho: %v: %v", pn, fmt.Sprintf(str, args...))
}
localSymVersion := syms.IncVersion()
base := f.Offset()
var hdr [7 * 4]uint8
if _, err := io.ReadFull(f, hdr[:]); err != nil {
return errorf("%v", err)
return errorf("reading hdr: %v", err)
}
var e binary.ByteOrder
if binary.BigEndian.Uint32(hdr[:])&^1 == 0xFEEDFACE {
e = binary.BigEndian
} else if binary.LittleEndian.Uint32(hdr[:])&^1 == 0xFEEDFACE {
......@@ -470,9 +447,9 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
return errorf("bad magic - not mach-o file")
}
is64 = e.Uint32(hdr[:]) == 0xFEEDFACF
ncmd = e.Uint32(hdr[4*4:])
cmdsz = e.Uint32(hdr[5*4:])
is64 := e.Uint32(hdr[:]) == 0xFEEDFACF
ncmd := e.Uint32(hdr[4*4:])
cmdsz := e.Uint32(hdr[5*4:])
if ncmd > 0x10000 || cmdsz >= 0x01000000 {
return errorf("implausible mach-o header ncmd=%d cmdsz=%d", ncmd, cmdsz)
}
......@@ -481,19 +458,19 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
f.Seek(4, 1) // skip reserved word in header
}
m = new(ldMachoObj)
m.f = f
m.e = e
m.cputype = uint(e.Uint32(hdr[1*4:]))
m.subcputype = uint(e.Uint32(hdr[2*4:]))
m.filetype = e.Uint32(hdr[3*4:])
m.ncmd = uint(ncmd)
m.flags = e.Uint32(hdr[6*4:])
m.is64 = is64
m.base = base
m.length = length
m.name = pn
m := &ldMachoObj{
f: f,
e: e,
cputype: uint(e.Uint32(hdr[1*4:])),
subcputype: uint(e.Uint32(hdr[2*4:])),
filetype: e.Uint32(hdr[3*4:]),
ncmd: uint(ncmd),
flags: e.Uint32(hdr[6*4:]),
is64: is64,
base: base,
length: length,
name: pn,
}
switch arch.Family {
default:
......@@ -511,21 +488,21 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
}
m.cmd = make([]ldMachoCmd, ncmd)
off = uint32(len(hdr))
cmdp = make([]byte, cmdsz)
if _, err2 := io.ReadFull(f, cmdp); err2 != nil {
cmdp := make([]byte, cmdsz)
if _, err := io.ReadFull(f, cmdp); err != nil {
return errorf("reading cmds: %v", err)
}
// read and parse load commands
c = nil
var c *ldMachoCmd
symtab = nil
dsymtab = nil
var symtab *ldMachoSymtab
var dsymtab *ldMachoDysymtab
for i := 0; uint32(i) < ncmd; i++ {
ty = e.Uint32(cmdp)
sz = e.Uint32(cmdp[4:])
off := uint32(len(hdr))
for i := uint32(0); i < ncmd; i++ {
ty := e.Uint32(cmdp)
sz := e.Uint32(cmdp[4:])
m.cmd[i].off = off
unpackcmd(cmdp, m, &m.cmd[i], uint(ty), uint(sz))
cmdp = cmdp[sz:]
......@@ -570,24 +547,24 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
return errorf("load segment out of range")
}
dat = make([]byte, c.seg.filesz)
if f.Seek(m.base+int64(c.seg.fileoff), 0) < 0 {
return errorf("cannot load object data: %v", err)
return errorf("cannot load object data: seek failed")
}
if _, err2 := io.ReadFull(f, dat); err2 != nil {
dat := make([]byte, c.seg.filesz)
if _, err := io.ReadFull(f, dat); err != nil {
return errorf("cannot load object data: %v", err)
}
for i := 0; uint32(i) < c.seg.nsect; i++ {
sect = &c.seg.sect[i]
for i := uint32(0); i < c.seg.nsect; i++ {
sect := &c.seg.sect[i]
if sect.segname != "__TEXT" && sect.segname != "__DATA" {
continue
}
if sect.name == "__eh_frame" {
continue
}
name = fmt.Sprintf("%s(%s/%s)", pkg, sect.segname, sect.name)
s = syms.Lookup(name, localSymVersion)
name := fmt.Sprintf("%s(%s/%s)", pkg, sect.segname, sect.name)
s := syms.Lookup(name, localSymVersion)
if s.Type != 0 {
return errorf("duplicate %s/%s", sect.segname, sect.name)
}
......@@ -619,14 +596,14 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// enter sub-symbols into symbol table.
// have to guess sizes from next symbol.
for i := 0; uint32(i) < symtab.nsym; i++ {
for i := uint32(0); i < symtab.nsym; i++ {
machsym := &symtab.sym[i]
if machsym.type_&N_STAB != 0 {
continue
}
// TODO: check sym->type against outer->type.
name = machsym.name
name := machsym.name
if name[0] == '_' && name[1] != '\x00' {
name = name[1:]
......@@ -635,7 +612,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
if machsym.type_&N_EXT == 0 {
v = localSymVersion
}
s = syms.Lookup(name, v)
s := syms.Lookup(name, v)
if machsym.type_&N_EXT == 0 {
s.Attr |= sym.AttrDuplicateOK
}
......@@ -647,8 +624,8 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
return errorf("reference to invalid section %d", machsym.sectnum)
}
sect = &c.seg.sect[machsym.sectnum-1]
outer = sect.sym
sect := &c.seg.sect[machsym.sectnum-1]
outer := sect.sym
if outer == nil {
return errorf("reference to invalid section %s/%s", sect.segname, sect.name)
}
......@@ -681,8 +658,8 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// Sort outer lists by address, adding to textp.
// This keeps textp in increasing address order.
for i := 0; uint32(i) < c.seg.nsect; i++ {
sect = &c.seg.sect[i]
s = sect.sym
sect := &c.seg.sect[i]
s := sect.sym
if s == nil {
continue
}
......@@ -690,7 +667,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
s.Sub = sym.SortSub(s.Sub)
// assign sizes, now that we know symbols in sorted order.
for s1 = s.Sub; s1 != nil; s1 = s1.Sub {
for s1 := s.Sub; s1 != nil; s1 = s1.Sub {
if s1.Sub != nil {
s1.Size = s1.Sub.Value - s1.Value
} else {
......@@ -705,7 +682,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
}
s.Attr |= sym.AttrOnList
textp = append(textp, s)
for s1 = s.Sub; s1 != nil; s1 = s1.Sub {
for s1 := s.Sub; s1 != nil; s1 = s1.Sub {
if s1.Attr.OnList() {
return errorf("symbol %s listed multiple times", s1.Name)
}
......@@ -717,8 +694,8 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// load relocations
for i := 0; uint32(i) < c.seg.nsect; i++ {
sect = &c.seg.sect[i]
s = sect.sym
sect := &c.seg.sect[i]
s := sect.sym
if s == nil {
continue
}
......@@ -726,12 +703,12 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
if sect.rel == nil {
continue
}
r = make([]sym.Reloc, sect.nreloc)
rpi = 0
r := make([]sym.Reloc, sect.nreloc)
rpi := 0
Reloc:
for j = 0; uint32(j) < sect.nreloc; j++ {
rp = &r[rpi]
rel = &sect.rel[j]
for j := uint32(0); j < sect.nreloc; j++ {
rp := &r[rpi]
rel := &sect.rel[j]
if rel.scattered != 0 {
if arch.Family != sys.I386 {
// mach-o only uses scattered relocation on 32-bit platforms
......@@ -743,7 +720,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// reference that it is.
// assume that the second in the pair is in this section
// and use that as the pc-relative base.
if uint32(j+1) >= sect.nreloc {
if j+1 >= sect.nreloc {
return errorf("unsupported scattered relocation %d", int(rel.type_))
}
......@@ -772,9 +749,8 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// now consider the desired symbol.
// find the section where it lives.
var ks *ldMachoSect
for k := 0; uint32(k) < c.seg.nsect; k++ {
ks = &c.seg.sect[k]
ks := &c.seg.sect[k]
if ks.addr <= uint64(rel.value) && uint64(rel.value) < ks.addr+ks.size {
if ks.sym != nil {
rp.Sym = ks.sym
......@@ -814,7 +790,6 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
}
return errorf("unsupported scattered relocation: invalid address %#x", rel.addr)
}
rp.Siz = rel.length
......@@ -838,7 +813,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// section found in the original object file.
//
// [For future reference, see Darwin's /usr/include/mach-o/x86_64/reloc.h]
secaddr = c.seg.sect[rel.symnum-1].addr
secaddr := c.seg.sect[rel.symnum-1].addr
rp.Add = int64(uint64(int64(int32(e.Uint32(s.P[rp.Off:])))+int64(rp.Off)+4) - secaddr)
} else {
......@@ -848,7 +823,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i
// An unsigned internal relocation has a value offset
// by the section address.
if arch.Family == sys.AMD64 && rel.extrn == 0 && rel.type_ == MACHO_X86_64_RELOC_UNSIGNED {
secaddr = c.seg.sect[rel.symnum-1].addr
secaddr := c.seg.sect[rel.symnum-1].addr
rp.Add -= int64(secaddr)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment