feat(asm): emit GOOBJ objects that link directly with the Go toolchain

Assisted-by: Qwen 3.8 Max Preview
This commit is contained in:
2026-07-17 18:57:04 +02:00
parent 900c9772b1
commit 0920edb092
8 changed files with 1075 additions and 31 deletions
+13 -4
View File
@@ -250,10 +250,19 @@ and Mach-O writers (`gasm asm --format elf|macho`) lay the code and data out
as `.text`/`.data` (or `__text`/`__data`) sections, export a symbol per
`TEXT` and `GLOBL` (the `<>` ones local, the rest global) and emit one
PC-relative relocation per static-symbol reference — undefined external
symbols included, so the output links with the system toolchain. GOOBJ
emission, the format the Go linker consumes directly, is the remaining
piece of Phase 2 (together with the rest of the EVEX set and the other
architectures).
symbols included, so the output links with the system toolchain. The GOOBJ
emitter (`gasm asm --format goobj`) writes the format the Go linker consumes
directly: the functions as non-package symbols (the way `cmd/asm` records
assembly symbols), the `GLOBL` data, one `FuncInfo` per function and the
pc-value tables — `pcsp` built from the prologue and epilogue stack
boundaries, plus flat `pcfile`, `pcline` and `pcinline` tables — so a
gasm-assembled object drops into a `go build` in place of the toolchain's.
The object preamble (the version-and-experiment header the linker compares
verbatim) is captured from the installed `go tool asm`, so the output is
always consistent with the toolchain that links it. External cross-package
references and the implicit funcdata/DWARF symbols remain future work (the
linker fills the latter's defaults); the rest of Phase 2 is those, the
remaining EVEX forms and the other architectures.
## Extension points