From: qmuntal Date: Fri, 10 Mar 2023 15:19:58 +0000 (+0100) Subject: cmd/link: define correct complex types values for COFF symbols X-Git-Tag: go1.21rc1~1310 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d9c29ec6a54f929f4b0736db6b7598a4c2305e5e;p=gostls13.git cmd/link: define correct complex types values for COFF symbols This CL updates IMAGE_SYM_DTYPE_FUNCTION and IMAGE_SYM_DTYPE_ARRAY definition and usage so their value can be set to what's defined in the Microsoft PE docs [1], fixing a long-standing TODO. [1] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#type-representation Change-Id: I93c19eb78e8a770e8c72245fe9495647e2c5ae5b Reviewed-on: https://go-review.googlesource.com/c/go/+/475355 Reviewed-by: Alex Brainman Run-TryBot: Quim Muntal Reviewed-by: Cherry Mui Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot --- diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 10c1dc4ab3..266e165920 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -98,11 +98,10 @@ const ( // See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format. // TODO(crawshaw): add these constants to debug/pe. const ( - // TODO: the Microsoft doco says IMAGE_SYM_DTYPE_ARRAY is 3 and IMAGE_SYM_DTYPE_FUNCTION is 2 IMAGE_SYM_TYPE_NULL = 0 IMAGE_SYM_TYPE_STRUCT = 8 - IMAGE_SYM_DTYPE_FUNCTION = 0x20 - IMAGE_SYM_DTYPE_ARRAY = 0x30 + IMAGE_SYM_DTYPE_FUNCTION = 2 + IMAGE_SYM_DTYPE_ARRAY = 3 IMAGE_SYM_CLASS_EXTERNAL = 2 IMAGE_SYM_CLASS_STATIC = 3 @@ -754,14 +753,12 @@ func (f *peFile) writeSymbols(ctxt *Link) { if ctxt.IsExternal() { peSymType = IMAGE_SYM_TYPE_NULL } else { - // TODO: fix IMAGE_SYM_DTYPE_ARRAY value and use following expression, instead of 0x0308 - // peSymType = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT - peSymType = 0x0308 // "array of structs" + peSymType = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT } sect, value, err := f.mapToPESection(ldr, s, ctxt.LinkMode) if err != nil { if t == sym.SDYNIMPORT || t == sym.SHOSTOBJ || t == sym.SUNDEFEXT { - peSymType = IMAGE_SYM_DTYPE_FUNCTION + peSymType = IMAGE_SYM_DTYPE_FUNCTION << 8 } else { ctxt.Errorf(s, "addpesym: %v", err) } diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go index 0d33823e4e..7ad4db9052 100644 --- a/src/cmd/link/internal/loadpe/ldpe.go +++ b/src/cmd/link/internal/loadpe/ldpe.go @@ -21,7 +21,6 @@ import ( ) const ( - // TODO: the Microsoft doco says IMAGE_SYM_DTYPE_ARRAY is 3 (same with IMAGE_SYM_DTYPE_POINTER and IMAGE_SYM_DTYPE_FUNCTION) IMAGE_SYM_UNDEFINED = 0 IMAGE_SYM_ABSOLUTE = -1 IMAGE_SYM_DEBUG = -2 @@ -43,9 +42,9 @@ const ( IMAGE_SYM_TYPE_DWORD = 15 IMAGE_SYM_TYPE_PCODE = 32768 IMAGE_SYM_DTYPE_NULL = 0 - IMAGE_SYM_DTYPE_POINTER = 0x10 - IMAGE_SYM_DTYPE_FUNCTION = 0x20 - IMAGE_SYM_DTYPE_ARRAY = 0x30 + IMAGE_SYM_DTYPE_POINTER = 1 + IMAGE_SYM_DTYPE_FUNCTION = 2 + IMAGE_SYM_DTYPE_ARRAY = 3 IMAGE_SYM_CLASS_END_OF_FUNCTION = -1 IMAGE_SYM_CLASS_NULL = 0 IMAGE_SYM_CLASS_AUTOMATIC = 1 @@ -673,7 +672,7 @@ func (state *peLoaderState) readpesym(pesym *pe.COFFSymbol) (*loader.SymbolBuild var s loader.Sym var bld *loader.SymbolBuilder - switch pesym.Type { + switch uint8(pesym.Type >> 8) { default: return nil, 0, fmt.Errorf("%s: invalid symbol type %d", symname, pesym.Type)