| // Copyright 2013 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | // NOTE: There are *three* independent implementations of this object | 
 | // file format in the Go source tree: | 
 | // | 
 | //	- cmd/internal/goobj/read.go (used by cmd/addr2line, cmd/nm, cmd/objdump, cmd/pprof) | 
 | //	- cmd/internal/obj/objfile.go (used by cmd/asm and cmd/compile) | 
 | //	- cmd/link/internal/objfile.go (used by cmd/link) | 
 | // | 
 | // When changing the object file format, remember to change all three. | 
 |  | 
 | // Originally, Go object files were Plan 9 object files, but no longer. | 
 | // Now they are more like standard object files, in that each symbol is defined | 
 | // by an associated memory image (bytes) and a list of relocations to apply | 
 | // during linking. We do not (yet?) use a standard file format, however. | 
 | // For now, the format is chosen to be as simple as possible to read and write. | 
 | // It may change for reasons of efficiency, or we may even switch to a | 
 | // standard file format if there are compelling benefits to doing so. | 
 | // See golang.org/s/go13linker for more background. | 
 | // | 
 | // The file format is: | 
 | // | 
 | //	- magic header: "\x00\x00go19ld" | 
 | //	- byte 1 - version number | 
 | //	- sequence of strings giving dependencies (imported packages) | 
 | //	- empty string (marks end of sequence) | 
 | //	- sequence of symbol references used by the defined symbols | 
 | //	- byte 0xff (marks end of sequence) | 
 | //	- sequence of integer lengths: | 
 | //		- total data length | 
 | //		- total number of relocations | 
 | //		- total number of pcdata | 
 | //		- total number of automatics | 
 | //		- total number of funcdata | 
 | //		- total number of files | 
 | //	- data, the content of the defined symbols | 
 | //	- sequence of defined symbols | 
 | //	- byte 0xff (marks end of sequence) | 
 | //	- magic footer: "\xff\xffgo19ld" | 
 | // | 
 | // All integers are stored in a zigzag varint format. | 
 | // See golang.org/s/go12symtab for a definition. | 
 | // | 
 | // Data blocks and strings are both stored as an integer | 
 | // followed by that many bytes. | 
 | // | 
 | // A symbol reference is a string name followed by a version. | 
 | // | 
 | // A symbol points to other symbols using an index into the symbol | 
 | // reference sequence. Index 0 corresponds to a nil symbol pointer. | 
 | // In the symbol layout described below "symref index" stands for this | 
 | // index. | 
 | // | 
 | // Each symbol is laid out as the following fields: | 
 | // | 
 | //	- byte 0xfe (sanity check for synchronization) | 
 | //	- type [byte] | 
 | //	- name & version [symref index] | 
 | //	- flags [int] | 
 | //		1<<0 dupok | 
 | //		1<<1 local | 
 | //		1<<2 add to typelink table | 
 | //	- size [int] | 
 | //	- gotype [symref index] | 
 | //	- p [data block] | 
 | //	- nr [int] | 
 | //	- r [nr relocations, sorted by off] | 
 | // | 
 | // If type == STEXT, there are a few more fields: | 
 | // | 
 | //	- args [int] | 
 | //	- locals [int] | 
 | //	- nosplit [int] | 
 | //	- flags [int] | 
 | //		1<<0 leaf | 
 | //		1<<1 C function | 
 | //		1<<2 function may call reflect.Type.Method | 
 | //		1<<3 function compiled with -shared | 
 | //	- nlocal [int] | 
 | //	- local [nlocal automatics] | 
 | //	- pcln [pcln table] | 
 | // | 
 | // Each relocation has the encoding: | 
 | // | 
 | //	- off [int] | 
 | //	- siz [int] | 
 | //	- type [int] | 
 | //	- add [int] | 
 | //	- sym [symref index] | 
 | // | 
 | // Each local has the encoding: | 
 | // | 
 | //	- asym [symref index] | 
 | //	- offset [int] | 
 | //	- type [int] | 
 | //	- gotype [symref index] | 
 | // | 
 | // The pcln table has the encoding: | 
 | // | 
 | //	- pcsp [data block] | 
 | //	- pcfile [data block] | 
 | //	- pcline [data block] | 
 | //	- pcinline [data block] | 
 | //	- npcdata [int] | 
 | //	- pcdata [npcdata data blocks] | 
 | //	- nfuncdata [int] | 
 | //	- funcdata [nfuncdata symref index] | 
 | //	- funcdatasym [nfuncdata ints] | 
 | //	- nfile [int] | 
 | //	- file [nfile symref index] | 
 | //	- ninlinedcall [int] | 
 | //	- inlinedcall [ninlinedcall int symref int symref] | 
 | // | 
 | // The file layout and meaning of type integers are architecture-independent. | 
 | // | 
 | // TODO(rsc): The file format is good for a first pass but needs work. | 
 | //	- There are SymID in the object file that should really just be strings. | 
 | package objabi |