aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/link/internal/ld/pe.go16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go
index 0167986c51..08e5b976b6 100644
--- a/src/cmd/link/internal/ld/pe.go
+++ b/src/cmd/link/internal/ld/pe.go
@@ -749,22 +749,20 @@ func (f *peFile) writeSymbols(ctxt *Link) {
name = mangleABIName(ctxt, ldr, s, name)
- var peSymType uint16
- if ctxt.IsExternal() {
- peSymType = IMAGE_SYM_TYPE_NULL
- } else {
+ var peSymType uint16 = IMAGE_SYM_TYPE_NULL
+ switch t {
+ case sym.STEXT, sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT:
// Microsoft's PE documentation is contradictory. It says that the symbol's complex type
// is stored in the pesym.Type most significant byte, but MSVC, LLVM, and mingw store it
- // in the 4 high bits of the less significant byte.
- peSymType = IMAGE_SYM_DTYPE_ARRAY<<4 + IMAGE_SYM_TYPE_STRUCT
+ // in the 4 high bits of the less significant byte. Also, the PE documentation says that
+ // the basic type for a function should be IMAGE_SYM_TYPE_VOID,
+ // but the reality is that it uses IMAGE_SYM_TYPE_NULL instead.
+ peSymType = IMAGE_SYM_DTYPE_FUNCTION<<4 + IMAGE_SYM_TYPE_NULL
}
sect, value, err := f.mapToPESection(ldr, s, ctxt.LinkMode)
if err != nil {
switch t {
case sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT:
- // Microsoft's PE documentation says that the basic type for a function should be
- // IMAGE_SYM_TYPE_VOID, but the reality is that it uses IMAGE_SYM_TYPE_NULL instead.
- peSymType = IMAGE_SYM_DTYPE_FUNCTION<<4 + IMAGE_SYM_TYPE_NULL
default:
ctxt.Errorf(s, "addpesym: %v", err)
}