mirror of git://gcc.gnu.org/git/gcc.git
121 lines
3.8 KiB
Go
121 lines
3.8 KiB
Go
// 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
|