cmd/link: ignore mapping symbols on riscv64

Specified in RISC-V ELF psABI[1], mapping symbols are symbols starting
with "$d" or "$x" with STT_NOTYPE, STB_LOCAL and zero sizes, indicating
boundaries between code and data in the same section.

Let's simply ignore them as they're only markers instead of real
symbols. This fixes linking errors like

	sym#63 ("$d"): ignoring symbol in section 4 (".riscv.attributes") (type 0)

when using CGO together with Clang and internal linker, which are caused
by unnecessary (but technically correct) mapping symbols created by LLVM
for various sections.

Fixes #73516

[1]: 87aecf6017/riscv-elf.adoc?plain=1#L1448
This commit is contained in:
Yao Zi 2025-05-03 08:37:30 +00:00
parent 49d6777d87
commit d7842ceafb
1 changed files with 8 additions and 0 deletions

View File

@ -602,6 +602,14 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader,
// See https://sourceware.org/bugzilla/show_bug.cgi?id=21809
continue
}
if arch.Family == sys.RISCV64 &&
(strings.HasPrefix(elfsym.name, "$d") || strings.HasPrefix(elfsym.name, "$x")) {
// Ignore RISC-V mapping symbols, which
// are similar to ARM64's case.
// See issue 73591.
continue
}
}
if strings.HasPrefix(elfsym.name, ".Linfo_string") {