On 2024-04-30, Souji Thenria <m...@souji-thenria.net> wrote:
>
> Could you elaborate on your point that Go ports are a pain? 
> I thought a port written in Go would probably be easier to maintain
> because no additional libraries are needed to run the program, and
> cross-compilation is relatively easy, too.

With current OpenBSD versions, system calls are only permitted from libc,
so all binaries making any system calls need to be linked with libc.

There's a common idiom in software written in Go to try to avoid touching
anything in C libraries and issue system calls directly instead - this no
longer works on OpenBSD (there is a special case because the Go compiler
has been patched to reroute SYS_IOCTl and SYS_SYSCTL to the libc wrapper
automatically but for any others, patches are required). Additionally
software needs to use a recent enough version of golang.org/x/sys and
not use an old version via vendoring or modules otherwise x/sys's own
use of syscall is a problem.

Cross-compilation of go software to run on current OpenBSD is mostly
not possible at the moment because the compiler changes mentioned above
are added via patches in the port and won't be in compiler binaries
produced for other OS.

There's another issue with the go module system used for "standard"
modern go ports: it mostly wants unmodified .mod and .zip files so it's
hard for a port to apply patches to anything other than the source code
for the main piece of software (i.e. not dependent modules). There is a
way around this in some cases by feeding in the zip/mod files in a
first stage and using "go mod vendor" to extract them before build,
allowing them to be patched, but this is a delicate and not very
pleasant area to work on (it's easy to break existing ports, some of
which already have bodges to work around this, also compiling all the
current ports using go to test any such changes uses loads of disk
space, cpu, and time).


Reply via email to