| // 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: "\x00go114ld" | |
| // - byte 1 - version number | |
| // - sequence of strings giving dependencies (imported packages) | |
| // - empty string (marks end of sequence) | |
| // - number of entries in the following sequence | |
| // - sequence of filename strings to generate debug information | |
| // - 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: "\xffgo114ld" | |
| // | |
| // 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 an ABI or -1 for static. | |
| // | |
| // 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 & ABI [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 |