| // Copyright 2025 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build linux && (386 || amd64 || arm || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x) |
| |
| package runtime_test |
| |
| import ( |
| "runtime" |
| "testing" |
| ) |
| |
| // DT_GNU_HASH hash function. |
| func gnuHash(s string) uint32 { |
| h := uint32(5381) |
| for _, r := range s { |
| h = (h << 5) + h + uint32(r) |
| } |
| return h |
| } |
| |
| // DT_HASH hash function. |
| func symHash(s string) uint32 { |
| var h, g uint32 |
| for _, r := range s { |
| h = (h << 4) + uint32(r) |
| g = h & 0xf0000000 |
| if g != 0 { |
| h ^= g >> 24 |
| } |
| h &^= g |
| } |
| return h |
| } |
| |
| func TestVDSOHash(t *testing.T) { |
| for _, sym := range runtime.VDSOSymbolKeys() { |
| name := sym.Name() |
| t.Run(name, func(t *testing.T) { |
| want := symHash(name) |
| if sym.SymHash() != want { |
| t.Errorf("SymHash got %#x want %#x", sym.SymHash(), want) |
| } |
| |
| want = gnuHash(name) |
| if sym.GNUHash() != want { |
| t.Errorf("GNUHash got %#x want %#x", sym.GNUHash(), want) |
| } |
| }) |
| } |
| } |