Go : кросс-компиляция и переносимость
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Go : кросс-компиляция и переносимость
независимый от платформы код
Но это всё - цветочки.
Настоящую переносимость между архитектурами и операционными системами и их стандартами обеспечивает среда языка Go.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
Код: Выделить всё
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("ты кто будешь?")
fmt.Printf("> ")
буфер := make([]byte, 120)
длина, _ := os.Stdin.Read(буфер) // возвращается 2 значения
Ω := длина
ответ := string(буфер[:Ω-1]) // убрали '\n'
fmt.Printf("какое длинное имя ... целых %d байт\n", Ω)
fmt.Printf("привет, %s\n", ответ)
}
Код: Выделить всё
[Olej@modules hello]$ gccgo -g hello.go -o hello
[Olej@modules hello]$ ls -l hello
-rwxrwxr-x. 1 Olej Olej 32833 авг 10 13:10 hello
Код: Выделить всё
[Olej@modules hello]$ ./hello
ты кто будешь?
> Вася
какое длинное имя ... целых 9 байт
привет, Вася
- Вложения
-
- hello.go
- (557 байт) 52 скачивания
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
Теперь я компилирую тот же (неизменный файл, что очень важно) компилирую в том же нативном десктопном x86_64 Linux под ARM аппаратную платформу:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ GOARCH=arm go build -o hello.32.arm hello.go
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ ls -l *.arm
-rwxrwxr-x 1 olej olej 1880350 мар 23 21:59 hello.32.arm
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/BHV/examples/hello$ file hello.32.arm
hello.32.arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, Go BuildID=ZfMUX4fIpDYH_dqrGeIZ/q3f4F1Z0legZmrfeS1Qu/Ozb37t0uutQShZb8-IJl/QT5B9gi5cCsDLo2SLM5f, not stripped
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
Переношу копированием бинарный исполнимый ELF файл в одноплатный компьютер Raspberry Pi 2 (Raspberry Pi 2 ... снова):
Код: Выделить всё
olej@raspberrypi:~ $ inxi -Cxxx
CPU: Info: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l rev: 5
features: Use -f option to see features bogomips: 256
Speed: 1000 MHz min/max: 600/1000 MHz Core speeds (MHz): 1: 1000 2: 1000 3: 1000 4: 1000
Код: Выделить всё
olej@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
Код: Выделить всё
olej@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.103-v7+ #1530 SMP Tue Mar 8 13:02:44 GMT 2022 armv7l GNU/Linux
Код: Выделить всё
olej@raspberrypi:~ $ ./hello.32.arm
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася
olej@raspberrypi:~ $
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
Теперь переношу точно так же копированием тот же исполнимый бинарный ELF-файл в другую архитектуру Orange Pi One (не совместимы аппаратно с Raspberry Pi - Orange Pi One ... снова):
Код: Выделить всё
olej@orangepione:~$ inxi -Cxxx
CPU: Topology: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l rev: 5
features: Use -f option to see features bogomips: 0
Speed: 1008 MHz min/max: 480/1008 MHz Core speeds (MHz): 1: 1008 2: 1008 3: 1008 4: 1008
Код: Выделить всё
olej@orangepione:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.4 LTS
Release: 20.04
Codename: focal
Код: Выделить всё
olej@orangepione:~$ uname -a
Linux orangepione 5.15.25-sunxi #22.02.1 SMP Sun Feb 27 09:23:25 UTC 2022 armv7l armv7l armv7l GNU/Linux
Код: Выделить всё
olej@orangepione:~$ ./hello.32.arm
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
Но это ещё далеко не всё!
Компилирую тот же исходный код в Linux под Windows платформы:
Код: Выделить всё
$ GOOS=windows GOARCH=386 go build -o hello.32.exe
$ GOOS=windows GOARCH=amd64 go build -o hello.64.exe
Код: Выделить всё
$ ls -l *.exe
-rwxrwxr-x 1 olej olej 1901056 янв 20 01:30 hello.32.exe
-rwxrwxr-x 1 olej olej 2138112 янв 20 01:31 hello.64.exe
$ file *.exe
hello.32.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
hello.64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Код: Выделить всё
X:\Users\Default\Downloads>dir
Volume in drive X is Boot
Volume Serial Number is D60A-0DC2
Directory of X:\Users\Default\Downloads
06/20/2018 02:00 AM <DIR> .
06/20/2018 02:00 AM <DIR> ..
01/20/2022 03:25 PM 1,054,653 drive-download-20220120T132509Z-001.zip
01/20/2022 03:30 PM 1,901,056 hello.32.exe
01/20/2022 03:30 PM 2,138,112 hello.64.exe
3 File(s) 5,093,821 bytes
2 Dir(s) 368,934,912 bytes free
Код: Выделить всё
X:\Users\Default\Downloads>hello.32.exe
ты кто будешь?
> bastard
какое длинное имя ... целых 9 байт
привет, bastard
Код: Выделить всё
X:\Users\Default\Downloads>hello.64.exe
ты кто будешь?
> windown
какое длинное имя ... целых 9 байт
привет, windown
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go: кросс-компиляция и переносимость
То, во что компилируется (под какую платформу) определяется 2-мя переменными среды Go: gеременная среды GOARCH определяет процессорную архитектуру, а переменная GOOS — операционную систему на этой архитектуре под которую нужно собирать приложение.
То что реализовано на текущую версию GoLang можно смотреть здесь - Go (Golang) GOOS and GOARCH :
• 17 операционных систем:
All GOOS values:
"aix", "android", "darwin", "dragonfly", "freebsd", "hurd", "illumos", "ios", "js", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows", "zos"
• под 24 процессорных платформ:
Вот где бинарная переносимость!All GOARCH values:
"386", "amd64", "amd64p32", "arm", "arm64", "arm64be", "armbe", "loong64", "mips", "mips64", "mips64le", "mips64p32", "mips64p32le", "mipsle", "ppc", "ppc64", "ppc64le", "riscv", "riscv64", "s390", "s390x", "sparc", "sparc64", "wasm"
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go : кросс-компиляция и переносимость
Но кроме переноса, вся инфраструктура Go представлена автономно (для установки) даже в такой "малышке" как Raspberry Pi и для архитектуры ARM v7:
Код: Выделить всё
olej@raspberrypi:~ $ uname -a
Linux raspberrypi 5.15.30-v7+ #1536 SMP Mon Mar 28 13:43:34 BST 2022 armv7l GNU/Linux
Код: Выделить всё
olej@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
Код: Выделить всё
olej@raspberrypi:~ $ aptitude search golang | wc -l
1741
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go : кросс-компиляция и переносимость
Для сравнения, на традиционной x86_64 платформе
Код: Выделить всё
olej@R420:~$ uname -a
Linux R420 5.4.0-107-generic #121-Ubuntu SMP Thu Mar 24 16:04:27 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Код: Выделить всё
olej@R420:~$ aptitude search golang | wc -l
1377
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Go : кросс-компиляция и переносимость
И ещё меньше, аппаратно и по цене, образец: Orange Pi One - Orange Pi One - Armbian Xfce:
Код: Выделить всё
olej@orangepione:~$ aptitude search golang | wc -l
1372
Код: Выделить всё
root@orangepione:~# go version
go version go1.13.8 linux/arm
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя