root/src/cmd/ld/lib.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Derived from Inferno utils/6l/l.h
// http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h
//
//      Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
//      Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
//      Portions Copyright © 1997-1999 Vita Nuova Limited
//      Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
//      Portions Copyright © 2004,2006 Bruce Ellis
//      Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
//      Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
//      Portions Copyright © 2009 The Go Authors.  All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

// Terrible but standard terminology.
// A segment describes a block of file to load into memory.
// A section further describes the pieces of that block for
// use in debuggers and such.

typedef struct Segment Segment;
typedef struct Section Section;

struct Segment
{
        uchar   rwx;            // permission as usual unix bits (5 = r-x etc)
        uvlong  vaddr;  // virtual address
        uvlong  len;            // length in memory
        uvlong  fileoff;        // file offset
        uvlong  filelen;        // length on disk
        Section*        sect;
};

#pragma incomplete struct Elf64_Shdr

struct Section
{
        uchar   rwx;
        int16   extnum;
        int32   align;
        char    *name;
        uvlong  vaddr;
        uvlong  len;
        Section *next;  // in segment list
        Segment *seg;
        struct Elf64_Shdr *elfsect;
        uvlong  reloff;
        uvlong  rellen;
};

extern  char    symname[];

EXTERN  char*   INITENTRY;
extern  char*   thestring;
extern  LinkArch*       thelinkarch;
EXTERN  char*   outfile;
EXTERN  int     ndynexp;
EXTERN  LSym**  dynexp;
EXTERN  int     nldflag;
EXTERN  char**  ldflag;
EXTERN  int     havedynamic;
EXTERN  int     funcalign;
EXTERN  int     iscgo;
EXTERN  int     elfglobalsymndx;
EXTERN  char*   flag_installsuffix;
EXTERN  int     flag_race;
EXTERN  int flag_shared;
EXTERN  char*   tracksym;
EXTERN  char*   interpreter;
EXTERN  char*   tmpdir;
EXTERN  char*   extld;
EXTERN  char*   extldflags;
EXTERN  int     debug_s; // backup old value of debug['s']
EXTERN  Link*   ctxt;
EXTERN  int32   HEADR;
EXTERN  int32   HEADTYPE;
EXTERN  int32   INITRND;
EXTERN  int64   INITTEXT;
EXTERN  int64   INITDAT;
EXTERN  char*   INITENTRY;              /* entry point */
EXTERN  char*   noname;
EXTERN  char*   paramspace;
EXTERN  int     nerrors;

EXTERN  int     linkmode;
EXTERN  int64   liveness;

// for dynexport field of LSym
enum
{
        CgoExportDynamic = 1<<0,
        CgoExportStatic = 1<<1,
};

EXTERN  Segment segtext;
EXTERN  Segment segrodata;
EXTERN  Segment segdata;
EXTERN  Segment segdwarf;

typedef struct Endian Endian;
struct Endian
{
        uint16  (*e16)(uchar*);
        uint32  (*e32)(uchar*);
        uint64  (*e64)(uchar*);
};

extern Endian be, le;

/* set by call to mywhatsys() */
extern  char*   goroot;
extern  char*   goarch;
extern  char*   goos;

/* whence for ldpkg */
enum {
        FileObj = 0,
        ArchiveObj,
        Pkgdef
};

typedef struct Header Header;
struct Header {
        char *name;
        int val;
};

EXTERN  char*   headstring;
extern  Header  headers[];

#pragma varargck        type    "Y"     LSym*
#pragma varargck        type    "Z"     char*
#pragma varargck        type    "i"     char*

// buffered output

EXTERN  Biobuf  bso;

EXTERN struct
{
        char    cbuf[MAXIO];    /* output buffer */
} buf;

EXTERN  int     cbc;
EXTERN  char*   cbp;
EXTERN  char*   cbpmax;

#define cput(c)\
        { *cbp++ = c;\
        if(--cbc <= 0)\
                cflush(); }

void    Lflag(char *arg);
int     Yconv(Fmt *fp);
int     Zconv(Fmt *fp);
void    addexport(void);
void    address(void);
Section*addsection(Segment *seg, char *name, int rwx);
void    addstrdata(char *name, char *value);
vlong   addstring(LSym *s, char *str);
void    asmelfsym(void);
void    asmplan9sym(void);
uint16  be16(uchar *b);
uint32  be32(uchar *b);
uint64  be64(uchar *b);
void    callgraph(void);
void    cflush(void);
void    codeblk(int32 addr, int32 size);
vlong   cpos(void);
void    cseek(vlong p);
void    cwrite(void *buf, int n);
void    datblk(int32 addr, int32 size);
int     datcmp(LSym *s1, LSym *s2);
vlong   datoff(vlong addr);
void    deadcode(void);
LSym*   decodetype_arrayelem(LSym *s);
vlong   decodetype_arraylen(LSym *s);
LSym*   decodetype_chanelem(LSym *s);
int     decodetype_funcdotdotdot(LSym *s);
int     decodetype_funcincount(LSym *s);
LSym*   decodetype_funcintype(LSym *s, int i);
int     decodetype_funcoutcount(LSym *s);
LSym*   decodetype_funcouttype(LSym *s, int i);
LSym*   decodetype_gc(LSym *s);
vlong   decodetype_ifacemethodcount(LSym *s);
uint8   decodetype_kind(LSym *s);
LSym*   decodetype_mapkey(LSym *s);
LSym*   decodetype_mapvalue(LSym *s);
LSym*   decodetype_ptrelem(LSym *s);
vlong   decodetype_size(LSym *s);
int     decodetype_structfieldcount(LSym *s);
char*   decodetype_structfieldname(LSym *s, int i);
vlong   decodetype_structfieldoffs(LSym *s, int i);
LSym*   decodetype_structfieldtype(LSym *s, int i);
void    dodata(void);
void    dostkcheck(void);
void    dostkoff(void);
void    dosymtype(void);
void    doversion(void);
void    doweak(void);
void    dynreloc(void);
void    dynrelocsym(LSym *s);
vlong   entryvalue(void);
void    errorexit(void);
void    follow(void);
void    genasmsym(void (*put)(LSym*, char*, int, vlong, vlong, int, LSym*));
void    growdatsize(vlong *datsizep, LSym *s);
char*   headstr(int v);
int     headtype(char *name);
void    hostlink(void);
void    hostobjs(void);
int     iconv(Fmt *fp);
void    importcycles(void);
void    linkarchinit(void);
void    ldelf(Biobuf *f, char *pkg, int64 len, char *pn);
void    ldhostobj(void (*ld)(Biobuf*, char*, int64, char*), Biobuf *f, char *pkg, int64 len, char *pn, char *file);
void    ldmacho(Biobuf *f, char *pkg, int64 len, char *pn);
void    ldobj(Biobuf *f, char *pkg, int64 len, char *pn, char *file, int whence);
void    ldpe(Biobuf *f, char *pkg, int64 len, char *pn);
void    ldpkg(Biobuf *f, char *pkg, int64 len, char *filename, int whence);
uint16  le16(uchar *b);
uint32  le32(uchar *b);
uint64  le64(uchar *b);
void    libinit(void);
LSym*   listsort(LSym *l, int (*cmp)(LSym*, LSym*), int off);
void    loadinternal(char *name);
void    loadlib(void);
void    lputb(int32 l);
void    lputl(int32 l);
void*   mal(uint32 n);
void    mark(LSym *s);
void    mywhatsys(void);
struct ar_hdr;
void    objfile(char *file, char *pkg);
void    patch(void);
int     pathchar(void);
void    pcln(void);
void    pclntab(void);
void    putelfsectionsym(LSym* s, int shndx);
void    putelfsymshndx(vlong sympos, int shndx);
void    putsymb(LSym *s, char *name, int t, vlong v, vlong size, int ver, LSym *typ);
int     rbyoff(const void *va, const void *vb);
void    reloc(void);
void    relocsym(LSym *s);
void    setheadtype(char *s);
void    setinterp(char *s);
void    setlinkmode(char *arg);
void    span(void);
void    strnput(char *s, int n);
vlong   symaddr(LSym *s);
void    symtab(void);
void    textaddress(void);
void    undef(void);
void    unmal(void *v, uint32 n);
void    usage(void);
void    vputb(uint64 v);
int     valuecmp(LSym *a, LSym *b);
void    vputl(uint64 v);
void    wputb(ushort w);
void    wputl(ushort w);
void    xdefine(char *p, int t, vlong v);
void    zerosig(char *sp);
void    archinit(void);
void    diag(char *fmt, ...);

#pragma varargck        argpos  diag    1

/* [<][>][^][v][top][bottom][index][help] */