github.com/rohankumardubey/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/cmd/ld/lib.h (about)

     1  // Derived from Inferno utils/6l/l.h
     2  // http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  enum
    32  {
    33  	Sxxx,
    34  
    35  	/* order here is order in output file */
    36  	/* readonly, executable */
    37  	STEXT,
    38  	SELFRXSECT,
    39  	
    40  	/* readonly, non-executable */
    41  	STYPE,
    42  	SSTRING,
    43  	SGOSTRING,
    44  	SGOFUNC,
    45  	SRODATA,
    46  	SFUNCTAB,
    47  	STYPELINK,
    48  	SSYMTAB, // TODO: move to unmapped section
    49  	SPCLNTAB,
    50  	SELFROSECT,
    51  	
    52  	/* writable, non-executable */
    53  	SMACHOPLT,
    54  	SELFSECT,
    55  	SMACHO,	/* Mach-O __nl_symbol_ptr */
    56  	SMACHOGOT,
    57  	SNOPTRDATA,
    58  	SINITARR,
    59  	SDATA,
    60  	SWINDOWS,
    61  	SBSS,
    62  	SNOPTRBSS,
    63  	STLSBSS,
    64  
    65  	/* not mapped */
    66  	SXREF,
    67  	SMACHOSYMSTR,
    68  	SMACHOSYMTAB,
    69  	SMACHOINDIRECTPLT,
    70  	SMACHOINDIRECTGOT,
    71  	SFILE,
    72  	SFILEPATH,
    73  	SCONST,
    74  	SDYNIMPORT,
    75  	SHOSTOBJ,
    76  
    77  	SSUB = 1<<8,	/* sub-symbol, linked from parent via ->sub list */
    78  	SMASK = SSUB - 1,
    79  	SHIDDEN = 1<<9, // hidden or local symbol
    80  
    81  	NHASH = 100003,
    82  };
    83  
    84  typedef struct Library Library;
    85  struct Library
    86  {
    87  	char *objref;	// object where we found the reference
    88  	char *srcref;	// src file where we found the reference
    89  	char *file;		// object file
    90  	char *pkg;	// import path
    91  };
    92  
    93  // Terrible but standard terminology.
    94  // A segment describes a block of file to load into memory.
    95  // A section further describes the pieces of that block for
    96  // use in debuggers and such.
    97  
    98  typedef struct Segment Segment;
    99  typedef struct Section Section;
   100  
   101  struct Segment
   102  {
   103  	uchar	rwx;		// permission as usual unix bits (5 = r-x etc)
   104  	uvlong	vaddr;	// virtual address
   105  	uvlong	len;		// length in memory
   106  	uvlong	fileoff;	// file offset
   107  	uvlong	filelen;	// length on disk
   108  	Section*	sect;
   109  };
   110  
   111  #pragma incomplete struct Elf64_Shdr
   112  
   113  struct Section
   114  {
   115  	uchar	rwx;
   116  	int16	extnum;
   117  	int32	align;
   118  	char	*name;
   119  	uvlong	vaddr;
   120  	uvlong	len;
   121  	Section	*next;	// in segment list
   122  	Segment	*seg;
   123  	struct Elf64_Shdr *elfsect;
   124  	uvlong	reloff;
   125  	uvlong	rellen;
   126  };
   127  
   128  typedef struct Hist Hist;
   129  
   130  #pragma incomplete struct Hist
   131  
   132  extern	char	symname[];
   133  extern	char	**libdir;
   134  extern	int	nlibdir;
   135  extern	int	version;
   136  
   137  EXTERN	char*	INITENTRY;
   138  EXTERN	char*	thestring;
   139  EXTERN	Library*	library;
   140  EXTERN	int	libraryp;
   141  EXTERN	int	nlibrary;
   142  EXTERN	Sym*	hash[NHASH];
   143  EXTERN	Sym*	allsym;
   144  EXTERN	Sym*	histfrog[MAXHIST];
   145  EXTERN	uchar	fnuxi8[8];
   146  EXTERN	uchar	fnuxi4[4];
   147  EXTERN	int	histfrogp;
   148  EXTERN	int	histgen;
   149  EXTERN	uchar	inuxi1[1];
   150  EXTERN	uchar	inuxi2[2];
   151  EXTERN	uchar	inuxi4[4];
   152  EXTERN	uchar	inuxi8[8];
   153  EXTERN	char*	outfile;
   154  EXTERN	int32	nsymbol;
   155  EXTERN	char*	thestring;
   156  EXTERN	int	ndynexp;
   157  EXTERN	Sym**	dynexp;
   158  EXTERN	int	nldflag;
   159  EXTERN	char**	ldflag;
   160  EXTERN	int	havedynamic;
   161  EXTERN	int	iscgo;
   162  EXTERN	int	elfglobalsymndx;
   163  EXTERN	char*	flag_installsuffix;
   164  EXTERN	int	flag_race;
   165  EXTERN	int flag_shared;
   166  EXTERN	char*	tracksym;
   167  EXTERN	char*	interpreter;
   168  EXTERN	char*	tmpdir;
   169  EXTERN	char*	extld;
   170  EXTERN	char*	extldflags;
   171  EXTERN	int	debug_s; // backup old value of debug['s']
   172  
   173  enum
   174  {
   175  	LinkAuto = 0,
   176  	LinkInternal,
   177  	LinkExternal,
   178  };
   179  EXTERN	int	linkmode;
   180  
   181  // for dynexport field of Sym
   182  enum
   183  {
   184  	CgoExportDynamic = 1<<0,
   185  	CgoExportStatic = 1<<1,
   186  };
   187  
   188  EXTERN	Segment	segtext;
   189  EXTERN	Segment	segrodata;
   190  EXTERN	Segment	segdata;
   191  EXTERN	Segment	segdwarf;
   192  
   193  void	setlinkmode(char*);
   194  void	addlib(char *src, char *obj);
   195  void	addlibpath(char *srcref, char *objref, char *file, char *pkg);
   196  Section*	addsection(Segment*, char*, int);
   197  void	copyhistfrog(char *buf, int nbuf);
   198  void	addhist(int32 line, int type);
   199  void	savehist(int32 line, int32 off);
   200  Hist*	gethist(void);
   201  void	getline(Hist*, int32 line, int32 *f, int32 *l);
   202  void	asmlc(void);
   203  void	histtoauto(void);
   204  void	collapsefrog(Sym *s);
   205  Sym*	newsym(char *symb, int v);
   206  Sym*	lookup(char *symb, int v);
   207  Sym*	rlookup(char *symb, int v);
   208  void	nuxiinit(void);
   209  int	find1(int32 l, int c);
   210  int	find2(int32 l, int c);
   211  int32	ieeedtof(Ieee *e);
   212  double	ieeedtod(Ieee *e);
   213  void	undefsym(Sym *s);
   214  void	zerosig(char *sp);
   215  void	readundefs(char *f, int t);
   216  void	loadlib(void);
   217  void	errorexit(void);
   218  void	mangle(char*);
   219  void	objfile(char *file, char *pkg);
   220  void	libinit(void);
   221  void	pclntab(void);
   222  void	symtab(void);
   223  void	Lflag(char *arg);
   224  void	usage(void);
   225  void	adddynrel(Sym*, Reloc*);
   226  void	adddynrela(Sym*, Sym*, Reloc*);
   227  void	ldobj1(Biobuf *f, char*, int64 len, char *pn);
   228  void	ldobj(Biobuf*, char*, int64, char*, char*, int);
   229  void	ldelf(Biobuf*, char*, int64, char*);
   230  void	ldmacho(Biobuf*, char*, int64, char*);
   231  void	ldpe(Biobuf*, char*, int64, char*);
   232  void	ldpkg(Biobuf*, char*, int64, char*, int);
   233  void	mark(Sym *s);
   234  void	mkfwd(void);
   235  char*	expandpkg(char*, char*);
   236  void	deadcode(void);
   237  Reloc*	addrel(Sym*);
   238  void	codeblk(int32, int32);
   239  void	datblk(int32, int32);
   240  void	reloc(void);
   241  void	relocsym(Sym*);
   242  void	savedata(Sym*, Prog*, char*);
   243  void	symgrow(Sym*, int32);
   244  void	addstrdata(char*, char*);
   245  vlong	addstring(Sym*, char*);
   246  vlong	adduint8(Sym*, uint8);
   247  vlong	adduint16(Sym*, uint16);
   248  vlong	adduint32(Sym*, uint32);
   249  vlong	adduint64(Sym*, uint64);
   250  vlong	adduintxx(Sym*, uint64, int);
   251  vlong	addaddr(Sym*, Sym*);
   252  vlong	addaddrplus(Sym*, Sym*, vlong);
   253  vlong	addpcrelplus(Sym*, Sym*, vlong);
   254  vlong	addsize(Sym*, Sym*);
   255  vlong	setaddrplus(Sym*, vlong, Sym*, vlong);
   256  vlong	setaddr(Sym*, vlong, Sym*);
   257  vlong	setuint8(Sym*, vlong, uint8);
   258  vlong	setuint16(Sym*, vlong, uint16);
   259  vlong	setuint32(Sym*, vlong, uint32);
   260  vlong	setuint64(Sym*, vlong, uint64);
   261  vlong	setuintxx(Sym*, vlong, uint64, vlong);
   262  void	asmsym(void);
   263  void	asmelfsym(void);
   264  void	asmplan9sym(void);
   265  void	putelfsectionsym(Sym*, int);
   266  void	putelfsymshndx(vlong, int);
   267  void	strnput(char*, int);
   268  void	dodata(void);
   269  void	dosymtype(void);
   270  void	address(void);
   271  void	textaddress(void);
   272  void	genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*));
   273  vlong	datoff(vlong);
   274  void	adddynlib(char*);
   275  int	archreloc(Reloc*, Sym*, vlong*);
   276  void	adddynsym(Sym*);
   277  void	addexport(void);
   278  void	dostkcheck(void);
   279  void	undef(void);
   280  void	doweak(void);
   281  void	setpersrc(Sym*);
   282  void	doversion(void);
   283  void	usage(void);
   284  void	setinterp(char*);
   285  Sym*	listsort(Sym*, int(*cmp)(Sym*, Sym*), int);
   286  int	valuecmp(Sym*, Sym*);
   287  void	hostobjs(void);
   288  void	hostlink(void);
   289  char*	estrdup(char*);
   290  void*	erealloc(void*, long);
   291  Sym*	defgostring(char*);
   292  
   293  int	pathchar(void);
   294  void*	mal(uint32);
   295  void	unmal(void*, uint32);
   296  void	mywhatsys(void);
   297  int	rbyoff(const void*, const void*);
   298  
   299  uint16	le16(uchar*);
   300  uint32	le32(uchar*);
   301  uint64	le64(uchar*);
   302  uint16	be16(uchar*);
   303  uint32	be32(uchar*);
   304  uint64	be64(uchar*);
   305  
   306  typedef struct Endian Endian;
   307  struct Endian
   308  {
   309  	uint16	(*e16)(uchar*);
   310  	uint32	(*e32)(uchar*);
   311  	uint64	(*e64)(uchar*);
   312  };
   313  
   314  extern Endian be, le;
   315  
   316  /* set by call to mywhatsys() */
   317  extern	char*	goroot;
   318  extern	char*	goarch;
   319  extern	char*	goos;
   320  
   321  /* whence for ldpkg */
   322  enum {
   323  	FileObj = 0,
   324  	ArchiveObj,
   325  	Pkgdef
   326  };
   327  
   328  /* executable header types */
   329  enum {
   330  	Hgarbunix = 0,	// garbage unix
   331  	Hnoheader,	// no header
   332  	Hunixcoff,	// unix coff
   333  	Hrisc,		// aif for risc os
   334  	Hplan9x32,	// plan 9 32-bit format
   335  	Hplan9x64,	// plan 9 64-bit format
   336  	Hmsdoscom,	// MS-DOS .COM
   337  	Hnetbsd,	// NetBSD
   338  	Hmsdosexe,	// fake MS-DOS .EXE
   339  	Hixp1200,	// IXP1200 (raw)
   340  	Helf,		// ELF32
   341  	Hipaq,		// ipaq
   342  	Hdarwin,	// Apple Mach-O
   343  	Hlinux,		// Linux ELF
   344  	Hfreebsd,	// FreeBSD ELF
   345  	Hwindows,	// MS Windows PE
   346  	Hopenbsd,	// OpenBSD ELF
   347  	Hdragonfly,	// DragonFly ELF
   348  };
   349  
   350  typedef struct Header Header;
   351  struct Header {
   352  	char *name;
   353  	int val;
   354  };
   355  
   356  EXTERN	char*	headstring;
   357  extern	Header	headers[];
   358  
   359  int	headtype(char*);
   360  char*	headstr(int);
   361  void	setheadtype(char*);
   362  
   363  int	Yconv(Fmt*);
   364  
   365  #pragma	varargck	type	"O"	int
   366  #pragma	varargck	type	"Y"	Sym*
   367  
   368  // buffered output
   369  
   370  EXTERN	Biobuf	bso;
   371  
   372  EXTERN struct
   373  {
   374  	char	cbuf[MAXIO];	/* output buffer */
   375  } buf;
   376  
   377  EXTERN	int	cbc;
   378  EXTERN	char*	cbp;
   379  EXTERN	char*	cbpmax;
   380  
   381  #define	cput(c)\
   382  	{ *cbp++ = c;\
   383  	if(--cbc <= 0)\
   384  		cflush(); }
   385  
   386  void	cflush(void);
   387  vlong	cpos(void);
   388  void	cseek(vlong);
   389  void	cwrite(void*, int);
   390  void	importcycles(void);
   391  int	Zconv(Fmt*);
   392  
   393  uint8	decodetype_kind(Sym*);
   394  vlong	decodetype_size(Sym*);
   395  Sym*	decodetype_gc(Sym*);
   396  Sym*	decodetype_arrayelem(Sym*);
   397  vlong	decodetype_arraylen(Sym*);
   398  Sym*	decodetype_ptrelem(Sym*);
   399  Sym*	decodetype_mapkey(Sym*);
   400  Sym*	decodetype_mapvalue(Sym*);
   401  Sym*	decodetype_chanelem(Sym*);
   402  int	decodetype_funcdotdotdot(Sym*);
   403  int	decodetype_funcincount(Sym*);
   404  int	decodetype_funcoutcount(Sym*);
   405  Sym*	decodetype_funcintype(Sym*, int);
   406  Sym*	decodetype_funcouttype(Sym*, int);
   407  int	decodetype_structfieldcount(Sym*);
   408  char*	decodetype_structfieldname(Sym*, int);
   409  Sym*	decodetype_structfieldtype(Sym*, int);
   410  vlong	decodetype_structfieldoffs(Sym*, int);
   411  vlong	decodetype_ifacemethodcount(Sym*);