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*);