]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: emit .tbss section when doing dynamic internal linking
authorShenghou Ma <minux.ma@gmail.com>
Fri, 17 May 2013 18:41:49 +0000 (02:41 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Fri, 17 May 2013 18:41:49 +0000 (02:41 +0800)
Fixes #5200.

R=iant, dave
CC=golang-dev
https://golang.org/cl/9383043

src/cmd/ld/elf.c

index daef5793ffd2f8bdd9162497d0e3f1094cbf9fdc..3ab909979fe7ae093f8c84efd76167b91ace272d 100644 (file)
@@ -887,7 +887,12 @@ doelf(void)
        addstring(shstrtab, ".data");
        addstring(shstrtab, ".bss");
        addstring(shstrtab, ".noptrbss");
-       if(linkmode == LinkExternal && HEADTYPE != Hopenbsd)
+       // generate .tbss section (except for OpenBSD where it's not supported)
+       // for dynamic internal linker or external linking, so that various
+       // binutils could correctly calculate PT_TLS size.
+       // see http://golang.org/issue/5200.
+       if(HEADTYPE != Hopenbsd)
+       if(!debug['d'] || linkmode == LinkExternal)
                addstring(shstrtab, ".tbss");
        if(HEADTYPE == Hnetbsd)
                addstring(shstrtab, ".note.netbsd.ident");
@@ -1412,6 +1417,16 @@ elfobj:
                sh->flags = 0;
        }
 
+       // generate .tbss section for dynamic internal linking (except for OpenBSD)
+       // external linking generates .tbss in data.c
+       if(linkmode == LinkInternal && !debug['d'] && HEADTYPE != Hopenbsd) {
+               sh = elfshname(".tbss");
+               sh->type = SHT_NOBITS;
+               sh->addralign = PtrSize;
+               sh->size = -tlsoffset;
+               sh->flags = SHF_ALLOC | SHF_TLS | SHF_WRITE;
+       }
+
        if(!debug['s']) {
                sh = elfshname(".symtab");
                sh->type = SHT_SYMTAB;