ELF go 二进制默认字节对齐

ELF go binaries default byte alignment

我凭经验看到 go ELF 二进制文件 使用 16 字节对齐。例如:

$ wget https://github.com/gardener/gardenctl/releases/download/v0.24.2/gardenctl-linux-amd64
$ readelf -W -s gardenctl-linux-amd64 | grep -E "FUNC" | wc -l
44746
$ readelf -W -s gardenctl-linux-amd64 | grep -E "0[ ]+[0-9]* FUNC" | wc -l
44744

所以绝大多数的最低有效字节都是 0。它是 总是 像在 go 二进制文件中那样吗?

这取决于平台。如果您签出了源代码库:

% cd go/src/cmd/link/internal
% grep "funcAlign =" */*.go
amd64/l.go:     funcAlign = 32
arm/l.go:       funcAlign = 4 // single-instruction alignment
arm64/l.go:     funcAlign = 16
mips64/l.go:    funcAlign = 8
ppc64/l.go:     funcAlign = 16
riscv64/l.go:   funcAlign = 8
s390x/l.go:     funcAlign = 16
x86/l.go:       funcAlign = 16

amd64 的对齐方式将来可能会回到 16;因为 https://github.com/golang/go/issues/35881

有一段时间是 32