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