mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
The offsets tool is essentially a wrapper around "go build -a -n". It creates a temporary folder with a dummy go file and runs the above command using the target OS/ARCH for the kernel and captures the output. The use of the "-a" flag forces go build to generate a build script for rebuilding all packages including the runtime ones. As a by-product of building the runtime package, the compiler emits the "go_asm.h" file that contains (among other things) the offsets for each element of the g, m and stack structures (see src/runtime/runtime2.go). These offsets are used in Go assembly files instead of hardcoded offsets. For example the following snippet accesses the pointer to m in the g struct address stored at register CX: MOVQ TLS, CX MOVQ g_m(CX), BX The offsets tool modifies the captured output from the go build command so it only includes the steps up to building the runtime package, executes the build script and post-processes the generated go_asm.h file to retain the entries relevant to g, m and stack and then formats them so they are compatible with nasm definitions (name equ value). Depending on the value of the "-out" option, the tool outputs the generated definitions either to STDOUT (default value for -out) or to a file.