github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/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  	STEXT,
    37  	STYPE,
    38  	SSTRING,
    39  	SGOSTRING,
    40  	SRODATA,
    41  	STYPELINK,
    42  	SSYMTAB,
    43  	SPCLNTAB,
    44  	SELFROSECT,
    45  	SMACHOPLT,
    46  	SELFSECT,
    47  	SMACHO,	/* Mach-O __nl_symbol_ptr */
    48  	SMACHOGOT,
    49  	SNOPTRDATA,
    50  	SDATARELRO,
    51  	SDATA,
    52  	SWINDOWS,
    53  	SBSS,
    54  	SNOPTRBSS,
    55  	STLSBSS,
    56  
    57  	SXREF,
    58  	SMACHOSYMSTR,
    59  	SMACHOSYMTAB,
    60  	SMACHOINDIRECTPLT,
    61  	SMACHOINDIRECTGOT,
    62  	SFILE,
    63  	SCONST,
    64  	SDYNIMPORT,
    65  	SHOSTOBJ,
    66  
    67  	SSUB = 1<<8,	/* sub-symbol, linked from parent via ->sub list */
    68  	SMASK = SSUB - 1,
    69  	SHIDDEN = 1<<9, // hidden or local symbol
    70  
    71  	NHASH = 100003,
    72  };
    73  
    74  enum
    75  {
    76  	// This value is known to the garbage collector and should be kept in
    77  	// sync with runtime/pkg/runtime.h
    78  	ArgsSizeUnknown = 0x80000000
    79  };
    80  
    81  typedef struct Library Library;
    82  struct Library
    83  {
    84  	char *objref;	// object where we found the reference
    85  	char *srcref;	// src file where we found the reference
    86  	char *file;		// object file
    87  	char *pkg;	// import path
    88  };
    89  
    90  // Terrible but standard terminology.
    91  // A segment describes a block of file to load into memory.
    92  // A section further describes the pieces of that block for
    93  // use in debuggers and such.
    94  
    95  typedef struct Segment Segment;
    96  typedef struct Section Section;
    97  
    98  struct Segment
    99  {
   100  	uchar	rwx;		// permission as usual unix bits (5 = r-x etc)
   101  	uvlong	vaddr;	// virtual address
   102  	uvlong	len;		// length in memory
   103  	uvlong	fileoff;	// file offset
   104  	uvlong	filelen;	// length on disk
   105  	Section*	sect;
   106  };
   107  
   108  #pragma incomplete struct Elf64_Shdr
   109  
   110  struct Section
   111  {
   112  	uchar	rwx;
   113  	int16	extnum;
   114  	int32	align;
   115  	char	*name;
   116  	uvlong	vaddr;
   117  	uvlong	len;
   118  	Section	*next;	// in segment list
   119  	Segment	*seg;
   120  	struct Elf64_Shdr *elfsect;
   121  	uvlong	reloff;
   122  	uvlong	rellen;
   123  };
   124  
   125  extern	char	symname[];
   126  extern	char	**libdir;
   127  extern	int	nlibdir;
   128  
   129  EXTERN	char*	INITENTRY;
   130  EXTERN	char*	thestring;
   131  EXTERN	Library*	library;
   132  EXTERN	int	libraryp;
   133  EXTERN	int	nlibrary;
   134  EXTERN	Sym*	hash[NHASH];
   135  EXTERN	Sym*	allsym;
   136  EXTERN	Sym*	histfrog[MAXHIST];
   137  EXTERN	uchar	fnuxi8[8];
   138  EXTERN	uchar	fnuxi4[4];
   139  EXTERN	int	histfrogp;
   140  EXTERN	int	histgen;
   141  EXTERN	uchar	inuxi1[1];
   142  EXTERN	uchar	inuxi2[2];
   143  EXTERN	uchar	inuxi4[4];
   144  EXTERN	uchar	inuxi8[8];
   145  EXTERN	char*	outfile;
   146  EXTERN	int32	nsymbol;
   147  EXTERN	char*	thestring;
   148  EXTERN	int	ndynexp;
   149  EXTERN	Sym**	dynexp;
   150  EXTERN	int	nldflag;
   151  EXTERN	char**	ldflag;
   152  EXTERN	int	havedynamic;
   153  EXTERN	int	iscgo;
   154  EXTERN	int	elfglobalsymndx;
   155  EXTERN	int	flag_race;
   156  EXTERN	int flag_shared;
   157  EXTERN	char*	tracksym;
   158  EXTERN	char*	interpreter;
   159  EXTERN	char*	tmpdir;
   160  EXTERN	char*	extld;
   161  EXTERN	char*	extldflags;
   162  
   163  enum
   164  {
   165  	LinkAuto = 0,
   166  	LinkInternal,
   167  	LinkExternal,
   168  };
   169  EXTERN	int	linkmode;
   170  
   171  // for dynexport field of Sym
   172  enum
   173  {
   174  	CgoExportDynamic = 1<<0,
   175  	CgoExportStatic = 1<<1,
   176  };
   177  
   178  EXTERN	Segment	segtext;
   179  EXTERN	Segment	segdata;
   180  EXTERN	Segment	segdwarf;
   181  
   182  void	setlinkmode(char*);
   183  void	addlib(char *src, char *obj);
   184  void	addlibpath(char *srcref, char *objref, char *file, char *pkg);
   185  Section*	addsection(Segment*, char*, int);
   186  void	copyhistfrog(char *buf, int nbuf);
   187  void	addhist(int32 line, int type);
   188  void	asmlc(void);
   189  void	histtoauto(void);
   190  void	collapsefrog(Sym *s);
   191  Sym*	newsym(char *symb, int v);
   192  Sym*	lookup(char *symb, int v);
   193  Sym*	rlookup(char *symb, int v);
   194  void	nuxiinit(void);
   195  int	find1(int32 l, int c);
   196  int	find2(int32 l, int c);
   197  int32	ieeedtof(Ieee *e);
   198  double	ieeedtod(Ieee *e);
   199  void	undefsym(Sym *s);
   200  void	zerosig(char *sp);
   201  void	readundefs(char *f, int t);
   202  int32	Bget4(Biobuf *f);
   203  void	loadlib(void);
   204  void	errorexit(void);
   205  void	mangle(char*);
   206  void	objfile(char *file, char *pkg);
   207  void	libinit(void);
   208  void	pclntab(void);
   209  void	symtab(void);
   210  void	Lflag(char *arg);
   211  void	usage(void);
   212  void	adddynrel(Sym*, Reloc*);
   213  void	adddynrela(Sym*, Sym*, Reloc*);
   214  Sym*	lookuprel(void);
   215  void	ldobj1(Biobuf *f, char*, int64 len, char *pn);
   216  void	ldobj(Biobuf*, char*, int64, char*, char*, int);
   217  void	ldelf(Biobuf*, char*, int64, char*);
   218  void	ldmacho(Biobuf*, char*, int64, char*);
   219  void	ldpe(Biobuf*, char*, int64, char*);
   220  void	ldpkg(Biobuf*, char*, int64, char*, int);
   221  void	mark(Sym *s);
   222  void	mkfwd(void);
   223  char*	expandpkg(char*, char*);
   224  void	deadcode(void);
   225  Reloc*	addrel(Sym*);
   226  void	codeblk(int32, int32);
   227  void	datblk(int32, int32);
   228  void	reloc(void);
   229  void	relocsym(Sym*);
   230  void	savedata(Sym*, Prog*, char*);
   231  void	symgrow(Sym*, int32);
   232  void	addstrdata(char*, char*);
   233  vlong	addstring(Sym*, char*);
   234  vlong	adduint8(Sym*, uint8);
   235  vlong	adduint16(Sym*, uint16);
   236  vlong	adduint32(Sym*, uint32);
   237  vlong	adduint64(Sym*, uint64);
   238  vlong	adduintxx(Sym*, uint64, int);
   239  vlong	addaddr(Sym*, Sym*);
   240  vlong	addaddrplus(Sym*, Sym*, vlong);
   241  vlong	addpcrelplus(Sym*, Sym*, vlong);
   242  vlong	addsize(Sym*, Sym*);
   243  vlong	setaddrplus(Sym*, vlong, Sym*, vlong);
   244  vlong	setaddr(Sym*, vlong, Sym*);
   245  void	setuint8(Sym*, vlong, uint8);
   246  void	setuint16(Sym*, vlong, uint16);
   247  void	setuint32(Sym*, vlong, uint32);
   248  void	setuint64(Sym*, vlong, uint64);
   249  void	asmsym(void);
   250  void	asmelfsym(void);
   251  void	asmplan9sym(void);
   252  void	putelfsectionsym(Sym*, int);
   253  void	putelfsymshndx(vlong, int);
   254  void	strnput(char*, int);
   255  void	dodata(void);
   256  void	dosymtype(void);
   257  void	address(void);
   258  void	textaddress(void);
   259  void	genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*));
   260  vlong	datoff(vlong);
   261  void	adddynlib(char*);
   262  int	archreloc(Reloc*, Sym*, vlong*);
   263  void	adddynsym(Sym*);
   264  void	addexport(void);
   265  void	dostkcheck(void);
   266  void	undef(void);
   267  void	doweak(void);
   268  void	setpersrc(Sym*);
   269  void	doversion(void);
   270  void	usage(void);
   271  void	setinterp(char*);
   272  Sym*	listsort(Sym*, int(*cmp)(Sym*, Sym*), int);
   273  int	valuecmp(Sym*, Sym*);
   274  void	hostobjs(void);
   275  void	hostlink(void);
   276  char*	estrdup(char*);
   277  void*	erealloc(void*, long);
   278  
   279  int	pathchar(void);
   280  void*	mal(uint32);
   281  void	unmal(void*, uint32);
   282  void	mywhatsys(void);
   283  int	rbyoff(const void*, const void*);
   284  
   285  uint16	le16(uchar*);
   286  uint32	le32(uchar*);
   287  uint64	le64(uchar*);
   288  uint16	be16(uchar*);
   289  uint32	be32(uchar*);
   290  uint64	be64(uchar*);
   291  
   292  typedef struct Endian Endian;
   293  struct Endian
   294  {
   295  	uint16	(*e16)(uchar*);
   296  	uint32	(*e32)(uchar*);
   297  	uint64	(*e64)(uchar*);
   298  };
   299  
   300  extern Endian be, le;
   301  
   302  /* set by call to mywhatsys() */
   303  extern	char*	goroot;
   304  extern	char*	goarch;
   305  extern	char*	goos;
   306  
   307  /* whence for ldpkg */
   308  enum {
   309  	FileObj = 0,
   310  	ArchiveObj,
   311  	Pkgdef
   312  };
   313  
   314  /* executable header types */
   315  enum {
   316  	Hgarbunix = 0,	// garbage unix
   317  	Hnoheader,	// no header
   318  	Hunixcoff,	// unix coff
   319  	Hrisc,		// aif for risc os
   320  	Hplan9x32,	// plan 9 32-bit format
   321  	Hplan9x64,	// plan 9 64-bit format
   322  	Hmsdoscom,	// MS-DOS .COM
   323  	Hnetbsd,	// NetBSD
   324  	Hmsdosexe,	// fake MS-DOS .EXE
   325  	Hixp1200,	// IXP1200 (raw)
   326  	Helf,		// ELF32
   327  	Hipaq,		// ipaq
   328  	Hdarwin,	// Apple Mach-O
   329  	Hlinux,		// Linux ELF
   330  	Hfreebsd,	// FreeBSD ELF
   331  	Hwindows,	// MS Windows PE
   332  	Hopenbsd,	// OpenBSD ELF
   333  };
   334  
   335  typedef struct Header Header;
   336  struct Header {
   337  	char *name;
   338  	int val;
   339  };
   340  
   341  EXTERN	char*	headstring;
   342  extern	Header	headers[];
   343  
   344  int	headtype(char*);
   345  char*	headstr(int);
   346  void	setheadtype(char*);
   347  
   348  int	Yconv(Fmt*);
   349  
   350  #pragma	varargck	type	"O"	int
   351  #pragma	varargck	type	"Y"	Sym*
   352  
   353  // buffered output
   354  
   355  EXTERN	Biobuf	bso;
   356  
   357  EXTERN struct
   358  {
   359  	char	cbuf[MAXIO];	/* output buffer */
   360  } buf;
   361  
   362  EXTERN	int	cbc;
   363  EXTERN	char*	cbp;
   364  EXTERN	char*	cbpmax;
   365  
   366  #define	cput(c)\
   367  	{ *cbp++ = c;\
   368  	if(--cbc <= 0)\
   369  		cflush(); }
   370  
   371  void	cflush(void);
   372  vlong	cpos(void);
   373  void	cseek(vlong);
   374  void	cwrite(void*, int);
   375  void	importcycles(void);
   376  int	Zconv(Fmt*);
   377  
   378  uint8	decodetype_kind(Sym*);
   379  vlong	decodetype_size(Sym*);
   380  Sym*	decodetype_gc(Sym*);
   381  Sym*	decodetype_arrayelem(Sym*);
   382  vlong	decodetype_arraylen(Sym*);
   383  Sym*	decodetype_ptrelem(Sym*);
   384  Sym*	decodetype_mapkey(Sym*);
   385  Sym*	decodetype_mapvalue(Sym*);
   386  Sym*	decodetype_chanelem(Sym*);
   387  int	decodetype_funcdotdotdot(Sym*);
   388  int	decodetype_funcincount(Sym*);
   389  int	decodetype_funcoutcount(Sym*);
   390  Sym*	decodetype_funcintype(Sym*, int);
   391  Sym*	decodetype_funcouttype(Sym*, int);
   392  int	decodetype_structfieldcount(Sym*);
   393  char*	decodetype_structfieldname(Sym*, int);
   394  Sym*	decodetype_structfieldtype(Sym*, int);
   395  vlong	decodetype_structfieldoffs(Sym*, int);
   396  vlong	decodetype_ifacemethodcount(Sym*);