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
我凭经验看到 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