...
Run Format

Source file src/cmd/internal/objabi/doc.go

Documentation: cmd/internal/objabi

  // 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
  

View as plain text