1
0
mirror of https://github.com/golang/go synced 2024-11-20 00:44:45 -07:00

cmd/link: shorter type symbol names

Use (part of) a SHA-1 checksum to replace type symbol names.

In typical programs this has no effect because types are not included
in the symbol table. But when dynamically linking, types are in the
table to make sure there is only one *rtype per Go type.

Eventually we may be able to get rid of all pointers to rtype values in
the binary, but probably not by 1.7. And this has a nice effect on
binary size today:

libstd.so:
	before 27.4MB
	after  26.2MB

For #6853.

Change-Id: I603d7f3e5baad84f59f2fd37eeb1e4ae5acfe44a
Reviewed-on: https://go-review.googlesource.com/21583
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
David Crawshaw 2016-04-06 13:09:06 -04:00
parent 4d5adf1eb1
commit f81ae3b22c

View File

@ -112,6 +112,8 @@ import (
"bytes"
"cmd/internal/bio"
"cmd/internal/obj"
"crypto/sha1"
"encoding/base64"
"io"
"log"
"strconv"
@ -555,6 +557,28 @@ func (r *objReader) readSymName() string {
r.readFull(r.rdBuf[:n])
}
r.rdBuf = adjName[:0] // in case 2*n wasn't enough
if DynlinkingGo() {
// These types are included in the symbol
// table when dynamically linking. To keep
// binary size down, we replace the names
// with SHA-1 prefixes.
//
// Keep the type.. prefix, which parts of the
// linker (like the DWARF generator) know means
// the symbol is not decodable.
//
// Leave type.runtime. symbols alone, because
// other parts of the linker manipulates them.
if strings.HasPrefix(s, "type.") && !strings.HasPrefix(s, "type.runtime.") {
hash := sha1.Sum([]byte(s))
prefix := "type."
if s[5] == '.' {
prefix = "type.."
}
s = prefix + base64.StdEncoding.EncodeToString(hash[:6])
}
}
return s
}
adjName = append(adjName, origName[:i]...)