# #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