LEFT | RIGHT |
1 // Inferno utils/6l/obj.c | 1 // Inferno utils/6l/obj.c |
2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c | 2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c |
3 // | 3 // |
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. | 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) | 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
6 // Portions Copyright © 1997-1999 Vita Nuova Limited | 6 // Portions Copyright © 1997-1999 Vita Nuova Limited |
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) | 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) |
8 // Portions Copyright © 2004,2006 Bruce Ellis | 8 // Portions Copyright © 2004,2006 Bruce Ellis |
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) | 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others | 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 /* | 60 /* |
61 * -Hplan9x32 -T4128 -R4096 is plan9 32-bit format | 61 * -Hplan9x32 -T4128 -R4096 is plan9 32-bit format |
62 * -Hplan9 -T0x200028 -R0x200000 is plan9 64-bit format | 62 * -Hplan9 -T0x200028 -R0x200000 is plan9 64-bit format |
63 * -Helf -T0x80110000 -R4096 is ELF32 | 63 * -Helf -T0x80110000 -R4096 is ELF32 |
64 * -Hdarwin -Tx -Rx is apple MH-exec | 64 * -Hdarwin -Tx -Rx is apple MH-exec |
65 * -Hlinux -Tx -Rx is linux elf-exec | 65 * -Hlinux -Tx -Rx is linux elf-exec |
66 * -Hfreebsd -Tx -Rx is FreeBSD elf-exec | 66 * -Hfreebsd -Tx -Rx is FreeBSD elf-exec |
67 * -Hnetbsd -Tx -Rx is NetBSD elf-exec | 67 * -Hnetbsd -Tx -Rx is NetBSD elf-exec |
68 * -Hopenbsd -Tx -Rx is OpenBSD elf-exec | 68 * -Hopenbsd -Tx -Rx is OpenBSD elf-exec |
69 * -Hwindows -Tx -Rx is MS Windows PE32+ | 69 * -Hwindows -Tx -Rx is MS Windows PE32+ |
70 * | |
71 * options used: 189BLQSWabcjlnpsvz | |
72 */ | 70 */ |
73 | |
74 void | |
75 usage(void) | |
76 { | |
77 fprint(2, "usage: 6l [-options] [-E entry] [-H head] [-I interpreter] [-
L dir] [-T text] [-R rnd] [-r path] [-o out] main.6\n"); | |
78 exits("usage"); | |
79 } | |
80 | 71 |
81 void | 72 void |
82 main(int argc, char *argv[]) | 73 main(int argc, char *argv[]) |
83 { | 74 { |
84 int c; | |
85 char *name, *val; | |
86 | |
87 Binit(&bso, 1, OWRITE); | 75 Binit(&bso, 1, OWRITE); |
88 listinit(); | 76 listinit(); |
89 memset(debug, 0, sizeof(debug)); | 77 memset(debug, 0, sizeof(debug)); |
90 nerrors = 0; | 78 nerrors = 0; |
91 outfile = nil; | 79 outfile = nil; |
92 HEADTYPE = -1; | 80 HEADTYPE = -1; |
93 INITTEXT = -1; | 81 INITTEXT = -1; |
94 INITDAT = -1; | 82 INITDAT = -1; |
95 INITRND = -1; | 83 INITRND = -1; |
96 INITENTRY = 0; | 84 INITENTRY = 0; |
97 LIBINITENTRY = 0; | 85 LIBINITENTRY = 0; |
98 nuxiinit(); | 86 nuxiinit(); |
99 | 87 |
100 » ARGBEGIN { | 88 » flagcount("1", "use alternate profiling code", &debug['1']); |
101 » default: | 89 » flagcount("8", "assume 64-bit addresses", &debug['8']); |
102 » » c = ARGC(); | 90 » flagfn1("B", "info: define ELF NT_GNU_BUILD_ID note", addbuildinfo); |
103 » » if(c == 'l') | 91 » flagint64("D", "addr: data address", &INITDAT); |
104 » » » usage(); | 92 » flagstr("E", "sym: entry symbol", &INITENTRY); |
105 » » if(c >= 0 && c < sizeof(debug)) | 93 » flagfn1("I", "interp: set ELF interp", setinterp); |
106 » » » debug[c]++; | 94 » flagfn1("L", "dir: add dir to library path", Lflag); |
107 » » break; | 95 » flagfn1("H", "head: header type", setheadtype); |
108 » case 'o': /* output to (next arg) */ | 96 » flagcount("K", "add stack underflow checks", &debug['K']); |
109 » » outfile = EARGF(usage()); | 97 » flagcount("O", "print pc-line tables", &debug['O']); |
110 » » break; | 98 » flagcount("Q", "debug byte-register code gen", &debug['Q']); |
111 » case 'E': | 99 » flagint32("R", "rnd: address rounding", &INITRND); |
112 » » INITENTRY = EARGF(usage()); | 100 » flagcount("S", "check type signatures", &debug['S']); |
113 » » break; | 101 » flagint64("T", "addr: text address", &INITTEXT); |
114 » case 'H': | 102 » flagfn0("V", "print version and exit", doversion); |
115 » » HEADTYPE = headtype(EARGF(usage())); | 103 » flagcount("W", "disassemble input", &debug['W']); |
116 » » break; | 104 » flagfn2("X", "name value: define string data", addstrdata); |
117 » case 'I': | 105 » flagcount("Z", "clear stack frame on entry", &debug['Z']); |
118 » » debug['I'] = 1; // denote cmdline interpreter override | 106 » flagcount("a", "disassemble output", &debug['a']); |
119 » » interpreter = EARGF(usage()); | 107 » flagcount("c", "dump call graph", &debug['c']); |
120 » » break; | 108 » flagcount("d", "disable dynamic executable", &debug['d']); |
121 » case 'L': | 109 » flagcount("f", "ignore version mismatch", &debug['f']); |
122 » » Lflag(EARGF(usage())); | 110 » flagcount("g", "disable go package data checks", &debug['g']); |
123 » » break; | 111 » flagstr("k", "sym: set field tracking symbol", &tracksym); |
124 » case 'T': | 112 » flagcount("n", "dump symbol table", &debug['n']); |
125 » » INITTEXT = atolwhex(EARGF(usage())); | 113 » flagstr("o", "outfile: set output file", &outfile); |
126 » » break; | 114 » flagcount("p", "insert profiling code", &debug['p']); |
127 » case 'D': | 115 » flagstr("r", "dir1:dir2:...: set ELF dynamic linker search path", &rpath
); |
128 » » INITDAT = atolwhex(EARGF(usage())); | 116 » flagcount("race", "enable race detector", &flag_race); |
129 » » break; | 117 » flagcount("s", "disable symbol table", &debug['s']); |
130 » case 'R': | 118 » flagcount("u", "reject unsafe packages", &debug['u']); |
131 » » INITRND = atolwhex(EARGF(usage())); | 119 » flagcount("v", "print link trace", &debug['v']); |
132 » » break; | 120 » flagcount("w", "disable DWARF generation", &debug['w']); |
133 » case 'r': | 121 » flagcount("shared", "generate shared object", &flag_shared); |
134 » » rpath = EARGF(usage()); | 122 »······· |
135 » » break; | 123 » flagparse(&argc, &argv, usage); |
136 » case 'V': | |
137 » » print("%cl version %s\n", thechar, getgoversion()); | |
138 » » errorexit(); | |
139 » case 'X': | |
140 » » name = EARGF(usage()); | |
141 » » val = EARGF(usage()); | |
142 » » addstrdata(name, val); | |
143 » » break; | |
144 » case 'B': | |
145 » » val = EARGF(usage()); | |
146 » » addbuildinfo(val); | |
147 » » break; | |
148 » case 'k': | |
149 » » tracksym = EARGF(usage()); | |
150 » » break; | |
151 » } ARGEND | |
152 | 124 |
153 if(argc != 1) | 125 if(argc != 1) |
154 usage(); | 126 usage(); |
155 | |
156 flag_pic = debug['U']; | |
157 | 127 |
158 mywhatsys(); // get goos | 128 mywhatsys(); // get goos |
159 | 129 |
160 if(HEADTYPE == -1) | 130 if(HEADTYPE == -1) |
161 HEADTYPE = headtype(goos); | 131 HEADTYPE = headtype(goos); |
162 | 132 |
163 if(outfile == nil) { | 133 if(outfile == nil) { |
164 if(HEADTYPE == Hwindows) | 134 if(HEADTYPE == Hwindows) |
165 outfile = "6.out.exe"; | 135 outfile = "6.out.exe"; |
166 else | 136 else |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 dwarfaddfrag(s->value, s->name); | 480 dwarfaddfrag(s->value, s->name); |
511 } | 481 } |
512 goto loop; | 482 goto loop; |
513 } | 483 } |
514 | 484 |
515 p = mal(sizeof(*p)); | 485 p = mal(sizeof(*p)); |
516 p->as = o; | 486 p->as = o; |
517 p->line = Bget4(f); | 487 p->line = Bget4(f); |
518 p->back = 2; | 488 p->back = 2; |
519 p->mode = mode; | 489 p->mode = mode; |
520 p->ft = 0; | |
521 p->tt = 0; | |
522 zaddr(pn, f, &p->from, h); | 490 zaddr(pn, f, &p->from, h); |
523 fromgotype = adrgotype; | 491 fromgotype = adrgotype; |
524 zaddr(pn, f, &p->to, h); | 492 zaddr(pn, f, &p->to, h); |
525 ········ | 493 ········ |
526 switch(p->as) { | 494 switch(p->as) { |
527 case ATEXT: | 495 case ATEXT: |
528 case ADATA: | 496 case ADATA: |
529 case AGLOBL: | 497 case AGLOBL: |
530 if(p->from.sym == S) | 498 if(p->from.sym == S) |
531 mangle(pn); | 499 mangle(pn); |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 { | 750 { |
783 Prog *p; | 751 Prog *p; |
784 | 752 |
785 p = prg(); | 753 p = prg(); |
786 p->link = q->link; | 754 p->link = q->link; |
787 q->link = p; | 755 q->link = p; |
788 p->line = q->line; | 756 p->line = q->line; |
789 p->mode = q->mode; | 757 p->mode = q->mode; |
790 return p; | 758 return p; |
791 } | 759 } |
LEFT | RIGHT |