func skiptopkgdef(b *obj.Biobuf) bool { /* archive header */ p := obj.Brdline(b, '\n') if p == "" { return false } if obj.Blinelen(b) != 8 { return false } if p != "!<arch>\n" { return false } /* symbol table may be first; skip it */ sz := arsize(b, "__.GOSYMDEF") if sz >= 0 { obj.Bseek(b, int64(sz), 1) } else { obj.Bseek(b, 8, 0) } /* package export block is next */ sz = arsize(b, "__.PKGDEF") if sz <= 0 { return false } return true }
func skiptopkgdef(b *obj.Biobuf) bool { // archive header p := obj.Brdline(b, '\n') if p == "" { return false } if obj.Blinelen(b) != 8 { return false } if p != "!<arch>\n" { return false } // package export block should be first sz := arsize(b, "__.PKGDEF") return sz > 0 }
func ldobj(f *obj.Biobuf, pkg string, length int64, pn string, file string, whence int) { eof := obj.Boffset(f) + length start := obj.Boffset(f) c1 := obj.Bgetc(f) c2 := obj.Bgetc(f) c3 := obj.Bgetc(f) c4 := obj.Bgetc(f) obj.Bseek(f, start, 0) magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4) if magic == 0x7f454c46 { // \x7F E L F ldhostobj(ldelf, f, pkg, length, pn, file) return } if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe { ldhostobj(ldmacho, f, pkg, length, pn, file) return } if c1 == 0x4c && c2 == 0x01 || c1 == 0x64 && c2 == 0x86 { ldhostobj(ldpe, f, pkg, length, pn, file) return } /* check the header */ line := obj.Brdline(f, '\n') if line == "" { if obj.Blinelen(f) > 0 { Diag("%s: not an object file", pn) return } Diag("truncated object file: %s", pn) return } if !strings.HasPrefix(line, "go object ") { if strings.HasSuffix(pn, ".go") { Exitf("%cl: input %s is not .%c file (use %cg to compile .go files)", Thearch.Thechar, pn, Thearch.Thechar, Thearch.Thechar) } if line == Thestring { // old header format: just $GOOS Diag("%s: stale object file", pn) return } Diag("%s: not an object file", pn) return } // First, check that the basic goos, goarch, and version match. t := fmt.Sprintf("%s %s %s ", goos, obj.Getgoarch(), obj.Getgoversion()) line = strings.TrimRight(line, "\n") if !strings.HasPrefix(line[10:]+" ", t) && Debug['f'] == 0 { Diag("%s: object is [%s] expected [%s]", pn, line[10:], t) return } // Second, check that longer lines match each other exactly, // so that the Go compiler and write additional information // that must be the same from run to run. if len(line) >= len(t)+10 { if theline == "" { theline = line[10:] } else if theline != line[10:] { Diag("%s: object is [%s] expected [%s]", pn, line[10:], theline) return } } /* skip over exports and other info -- ends with \n!\n */ import0 := obj.Boffset(f) c1 = '\n' // the last line ended in \n c2 = obj.Bgetc(f) c3 = obj.Bgetc(f) for c1 != '\n' || c2 != '!' || c3 != '\n' { c1 = c2 c2 = c3 c3 = obj.Bgetc(f) if c3 == obj.Beof { Diag("truncated object file: %s", pn) return } } import1 := obj.Boffset(f) obj.Bseek(f, import0, 0) ldpkg(f, pkg, import1-import0-2, pn, whence) // -2 for !\n obj.Bseek(f, import1, 0) ldobjfile(Ctxt, f, pkg, eof-obj.Boffset(f), pn) }