diff options
Diffstat (limited to 'src/cmd/ld/symtab.c')
-rw-r--r-- | src/cmd/ld/symtab.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c index 6d321c0bb..156270c8f 100644 --- a/src/cmd/ld/symtab.c +++ b/src/cmd/ld/symtab.c @@ -198,13 +198,18 @@ asmelfsym(void) genasmsym(putelfsym); if(linkmode == LinkExternal && HEADTYPE != Hopenbsd) { - s = linklookup(ctxt, "runtime.tlsgm", 0); + s = linklookup(ctxt, "runtime.tlsg", 0); if(s->sect == nil) { ctxt->cursym = nil; diag("missing section for %s", s->name); errorexit(); } - putelfsyment(putelfstr(s->name), 0, 2*PtrSize, (STB_LOCAL<<4)|STT_TLS, s->sect->elfsect->shnum, 0); + if (strcmp(goos, "android") == 0) { + // Android emulates runtime.tlsg as a regular variable. + putelfsyment(putelfstr(s->name), 0, s->size, (STB_LOCAL<<4)|STT_OBJECT, s->sect->elfsect->shnum, 0); + } else { + putelfsyment(putelfstr(s->name), 0, s->size, (STB_LOCAL<<4)|STT_TLS, s->sect->elfsect->shnum, 0); + } s->elfsym = numelfsym++; } @@ -341,36 +346,36 @@ symtab(void) // Define these so that they'll get put into the symbol table. // data.c:/^address will provide the actual values. - xdefine("text", STEXT, 0); - xdefine("etext", STEXT, 0); - xdefine("typelink", SRODATA, 0); - xdefine("etypelink", SRODATA, 0); - xdefine("rodata", SRODATA, 0); - xdefine("erodata", SRODATA, 0); - xdefine("noptrdata", SNOPTRDATA, 0); - xdefine("enoptrdata", SNOPTRDATA, 0); - xdefine("data", SDATA, 0); - xdefine("edata", SDATA, 0); - xdefine("bss", SBSS, 0); - xdefine("ebss", SBSS, 0); - xdefine("noptrbss", SNOPTRBSS, 0); - xdefine("enoptrbss", SNOPTRBSS, 0); - xdefine("end", SBSS, 0); - xdefine("epclntab", SRODATA, 0); - xdefine("esymtab", SRODATA, 0); + xdefine("runtime.text", STEXT, 0); + xdefine("runtime.etext", STEXT, 0); + xdefine("runtime.typelink", SRODATA, 0); + xdefine("runtime.etypelink", SRODATA, 0); + xdefine("runtime.rodata", SRODATA, 0); + xdefine("runtime.erodata", SRODATA, 0); + xdefine("runtime.noptrdata", SNOPTRDATA, 0); + xdefine("runtime.enoptrdata", SNOPTRDATA, 0); + xdefine("runtime.data", SDATA, 0); + xdefine("runtime.edata", SDATA, 0); + xdefine("runtime.bss", SBSS, 0); + xdefine("runtime.ebss", SBSS, 0); + xdefine("runtime.noptrbss", SNOPTRBSS, 0); + xdefine("runtime.enoptrbss", SNOPTRBSS, 0); + xdefine("runtime.end", SBSS, 0); + xdefine("runtime.epclntab", SRODATA, 0); + xdefine("runtime.esymtab", SRODATA, 0); // garbage collection symbols - s = linklookup(ctxt, "gcdata", 0); + s = linklookup(ctxt, "runtime.gcdata", 0); s->type = SRODATA; s->size = 0; s->reachable = 1; - xdefine("egcdata", SRODATA, 0); + xdefine("runtime.egcdata", SRODATA, 0); - s = linklookup(ctxt, "gcbss", 0); + s = linklookup(ctxt, "runtime.gcbss", 0); s->type = SRODATA; s->size = 0; s->reachable = 1; - xdefine("egcbss", SRODATA, 0); + xdefine("runtime.egcbss", SRODATA, 0); // pseudo-symbols to mark locations of type, string, and go string data. s = linklookup(ctxt, "type.*", 0); @@ -391,9 +396,9 @@ symtab(void) s->reachable = 1; symgofunc = s; - symtypelink = linklookup(ctxt, "typelink", 0); + symtypelink = linklookup(ctxt, "runtime.typelink", 0); - symt = linklookup(ctxt, "symtab", 0); + symt = linklookup(ctxt, "runtime.symtab", 0); symt->type = SSYMTAB; symt->size = 0; symt->reachable = 1; |