Двоичные файлы ELF go выравнивание байтов по умолчанию

# #go #elf #memory-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?

Ответ №1:

Это зависит от платформы. Если у вас есть проверенное исходное репо:

 % 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; на некоторое время оно составляет 32 из-за https://github.com/golang/go/issues/35881