56
57
memmove(elfstrdat+off, s, n);
58
// replace "·" as ".", because DTrace cannot handle it.
61
p = q = elfstrdat+off;
63
if((uchar)*q == 0xc2 && (uchar)*(q+1) == 0xb7) {
86
102
static int elfbind;
89
putelfsym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
105
putelfsym(LSym *x, char *s, int t, vlong addr, vlong size, int ver, LSym *go)
91
107
int bind, type, off;
146
putelfsectionsym(Sym* s, int shndx)
162
putelfsectionsym(LSym* s, int shndx)
148
164
putelfsyment(0, 0, 0, (STB_LOCAL<<4)|STT_SECTION, shndx, 0);
149
165
s->elfsym = numelfsym++;
181
198
genasmsym(putelfsym);
183
200
if(linkmode == LinkExternal && HEADTYPE != Hopenbsd) {
184
s = lookup("runtime.tlsgm", 0);
201
s = linklookup(ctxt, "runtime.tlsgm", 0);
185
202
if(s->sect == nil) {
187
204
diag("missing section for %s", s->name);
195
212
elfglobalsymndx = numelfsym;
196
213
genasmsym(putelfsym);
198
for(s=allsym; s!=S; s=s->allsym) {
199
if(s->type != SHOSTOBJ)
215
for(s=ctxt->allsym; s!=S; s=s->allsym) {
216
if(s->type != SHOSTOBJ && !(s->type == SDYNIMPORT && s->reachable))
201
putelfsyment(putelfstr(s->name), 0, 0, (STB_GLOBAL<<4)|STT_NOTYPE, 0, 0);
218
if(s->type == SDYNIMPORT)
222
putelfsyment(putelfstr(name), 0, 0, (STB_GLOBAL<<4)|STT_NOTYPE, 0, 0);
202
223
s->elfsym = numelfsym++;
207
putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
228
putplan9sym(LSym *x, char *s, int t, vlong addr, vlong size, int ver, LSym *go)
263
284
genasmsym(putplan9sym);
273
symgrow(symt, symt->size+1);
274
p = symt->p + symt->size;
284
symgrow(symt, symt->size+4);
285
p = symt->p + symt->size;
298
symgrow(symt, symt->size+4);
299
p = symt->p + symt->size;
307
static void (*slput)(int32);
355
// Emit symbol table entry.
356
// The table format is described at the top of ../../pkg/runtime/symtab.c.
358
putsymb(Sym *s, char *name, int t, vlong v, vlong size, int ver, Sym *typ)
367
if('A' <= t && t <= 'Z')
368
c = t - 'A' + (ver ? 26 : 0);
369
else if('a' <= t && t <= 'z')
372
diag("invalid symbol table type %c", t);
378
c |= 0x40; // wide value
380
c |= 0x80; // has go type
390
rel->off = symt->size;
397
diag("negative value in symbol table: %s %lld", name, v);
408
// go type if present
411
diag("unreachable type %s", typ->name);
416
rel->off = symt->size;
426
if(t == 'Z' || t == 'z') {
428
for(i=1; name[i] != 0 || name[i+1] != 0; i += 2) {
435
for(i=0; name[i]; i++)
441
if(t == 'z' || t == 'Z') {
442
Bprint(&bso, "%c %.8llux ", t, v);
443
for(i=1; name[i] != 0 || name[i+1] != 0; i+=2) {
444
f = ((name[i]&0xff) << 8) | (name[i+1]&0xff);
445
Bprint(&bso, "/%x", f);
451
Bprint(&bso, "%c %.8llux %s<%d> %s\n", t, v, name, ver, typ ? typ->name : "");
453
Bprint(&bso, "%c %.8llux %s %s\n", t, v, name, typ ? typ->name : "");
460
Sym *s, *symtype, *symtypelink, *symgostring, *symgofunc;
338
LSym *s, *symtype, *symtypelink, *symgostring, *symgofunc;
482
360
xdefine("esymtab", SRODATA, 0);
484
362
// garbage collection symbols
485
s = lookup("gcdata", 0);
363
s = linklookup(ctxt, "gcdata", 0);
486
364
s->type = SRODATA;
488
366
s->reachable = 1;
489
367
xdefine("egcdata", SRODATA, 0);
491
s = lookup("gcbss", 0);
369
s = linklookup(ctxt, "gcbss", 0);
492
370
s->type = SRODATA;
494
372
s->reachable = 1;
495
373
xdefine("egcbss", SRODATA, 0);
497
375
// pseudo-symbols to mark locations of type, string, and go string data.
498
s = lookup("type.*", 0);
376
s = linklookup(ctxt, "type.*", 0);
501
379
s->reachable = 1;
504
s = lookup("go.string.*", 0);
382
s = linklookup(ctxt, "go.string.*", 0);
505
383
s->type = SGOSTRING;
507
385
s->reachable = 1;
510
s = lookup("go.func.*", 0);
388
s = linklookup(ctxt, "go.func.*", 0);
511
389
s->type = SGOFUNC;
513
391
s->reachable = 1;
516
symtypelink = lookup("typelink", 0);
394
symtypelink = linklookup(ctxt, "typelink", 0);
518
symt = lookup("symtab", 0);
396
symt = linklookup(ctxt, "symtab", 0);
519
397
symt->type = SSYMTAB;
521
399
symt->reachable = 1;
524
402
// within a type they sort by size, so the .* symbols
525
403
// just defined above will be first.
526
404
// hide the specific symbols.
527
for(s = allsym; s != S; s = s->allsym) {
405
for(s = ctxt->allsym; s != S; s = s->allsym) {
528
406
if(!s->reachable || s->special || s->type != SRODATA)
530
408
if(strncmp(s->name, "type.", 5) == 0) {
548
426
s->outer = symgofunc;
557
diag("unknown architecture %c", thechar);
562
// little-endian symbol table
566
// big-endian symbol table
570
// new symbol table header.
428
if(strncmp(s->name, "gcargs.", 7) == 0 || strncmp(s->name, "gclocals.", 9) == 0 || strncmp(s->name, "gclocals·", 10) == 0) {
431
s->outer = symgofunc;
433
liveness += (s->size+s->align-1)&~(s->align-1);