偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用 Golang 的交叉編譯

開(kāi)發(fā) 測(cè)試
在 Linux 上測(cè)試軟件時(shí),我使用各種架構(gòu)的服務(wù)器,例如 Intel、AMD、Arm 等。當(dāng)我 分配了一臺(tái)滿足我的測(cè)試需求的 Linux 機(jī)器,我仍然需要執(zhí)行許多步驟。

走出舒適區(qū),我了解了 Go 的交叉編譯功能。

在 Linux 上測(cè)試軟件時(shí),我使用各種架構(gòu)的服務(wù)器,例如 Intel、AMD、Arm 等。當(dāng)我 分配了一臺(tái)滿足我的測(cè)試需求的 Linux 機(jī)器,我仍然需要執(zhí)行許多步驟:

  1. 下載并安裝必備軟件
  2. 驗(yàn)證構(gòu)建服務(wù)器上是否有新的測(cè)試軟件包
  3. 獲取并設(shè)置依賴軟件包所需的 yum 倉(cāng)庫(kù)
  4. 下載并安裝新的測(cè)試軟件包(基于步驟 2)
  5. 獲取并設(shè)置必需的 SSL 證書(shū)
  6. 設(shè)置測(cè)試環(huán)境,獲取所需的 Git 倉(cāng)庫(kù),更改配置,重新啟動(dòng)守護(hù)進(jìn)程等
  7. 做其他需要做的事情

用腳本自動(dòng)化

這些步驟非常常規(guī),以至于有必要對(duì)其進(jìn)行自動(dòng)化并將腳本保存到中央位置(例如文件服務(wù)器),在需要時(shí)可以在此處下載腳本。為此,我編寫了 100-120 行的 Bash shell 腳本,它為我完成了所有配置(包括錯(cuò)誤檢查)。這個(gè)腳本通過(guò)以下方式簡(jiǎn)化了我的工作流程:

  • 配置新的 Linux 系統(tǒng)(支持測(cè)試的架構(gòu))
  • 登錄系統(tǒng)并從中央位置下載自動(dòng)化 shell 腳本
  • 運(yùn)行它來(lái)配置系統(tǒng)
  • 開(kāi)始測(cè)試

學(xué)習(xí) Go 語(yǔ)言

我想學(xué)習(xí) Go 語(yǔ)言 有一段時(shí)間了,將我心愛(ài)的 Shell 腳本轉(zhuǎn)換為 Go 程序似乎是一個(gè)很好的項(xiàng)目,可以幫助我入門。它的語(yǔ)法看起來(lái)很簡(jiǎn)單,在嘗試了一些測(cè)試程序后,我開(kāi)始著手提高自己的知識(shí)并熟悉 Go 標(biāo)準(zhǔn)庫(kù)。

我花了一個(gè)星期的時(shí)間在筆記本電腦上編寫 Go 程序。我經(jīng)常在我的 x86 服務(wù)器上測(cè)試程序,清除錯(cuò)誤并使程序健壯起來(lái),一切都很順利。

直到完全轉(zhuǎn)換到 Go 程序前,我繼續(xù)依賴自己的 shell 腳本。然后,我將二進(jìn)制文件推送到中央文件服務(wù)器上,以便每次配置新服務(wù)器時(shí),我要做的就是獲取二進(jìn)制文件,將可執(zhí)行標(biāo)志打開(kāi),然后運(yùn)行二進(jìn)制文件。我對(duì)早期的結(jié)果很滿意:

  1. $ wget http://file.example.com/<myuser>/bins/prepnode 
  2. $ chmod  +x ./prepnode 
  3. $ ./prepnode 

然后,出現(xiàn)了一個(gè)問(wèn)題

第二周,我從資源池中分配了一臺(tái)新的服務(wù)器,像往常一樣,我下載了二進(jìn)制文件,設(shè)置了可執(zhí)行標(biāo)志,然后運(yùn)行二進(jìn)制文件。但這次它出錯(cuò)了,是一個(gè)奇怪的錯(cuò)誤:

  1. $ ./prepnode  
  2. bash: ./prepnode: cannot execute binary file: Exec format error  
  3. $  

起初,我以為可能沒(méi)有成功設(shè)置可執(zhí)行標(biāo)志。但是,它已按預(yù)期設(shè)置:

  1. $ ls -l prepnode 
  2. -rwxr-xr-x. 1 root root 2640529 Dec 16 05:43 prepnode 

發(fā)生了什么事?我沒(méi)有對(duì)源代碼進(jìn)行任何更改,編譯沒(méi)有引發(fā)任何錯(cuò)誤或警告,而且上次運(yùn)行時(shí)效果很好,因此我仔細(xì)查看了錯(cuò)誤消息 format error。

我檢查了二進(jìn)制文件的格式,一切看起來(lái)都沒(méi)問(wèn)題:

  1. $ file prepnode 
  2. prepnode: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped 

我迅速運(yùn)行了以下命令,識(shí)別所配置的測(cè)試服務(wù)器的架構(gòu)以及二進(jìn)制試圖運(yùn)行的平臺(tái)。它是 Arm64 架構(gòu),但是我編譯的二進(jìn)制文件(在我的 x86 筆記本電腦上)生成的是 x86-64 格式的二進(jìn)制文件:

  1. $ uname -m
  2. aarch64 

腳本編寫人員的編譯第一課

在那之前,我從未考慮過(guò)這種情況(盡管我知道這一點(diǎn))。我主要研究腳本語(yǔ)言(通常是 Python)以及 Shell 腳本。在任何架構(gòu)的大多數(shù) Linux 服務(wù)器上都可以使用 Bash Shell 和 Python 解釋器??傊耙磺卸己茼樌?。

但是,現(xiàn)在我正在處理 Go 這種編譯語(yǔ)言,它生成可執(zhí)行的二進(jìn)制文件。編譯后的二進(jìn)制文件由特定架構(gòu)的 指令碼 或匯編指令組成,這就是為什么我收到格式錯(cuò)誤的原因。由于 Arm64 CPU(運(yùn)行二進(jìn)制文件的地方)無(wú)法解釋二進(jìn)制文件的 x86-64 指令,因此它拋出錯(cuò)誤。以前,shell 和 Python 解釋器為我處理了底層指令碼或特定架構(gòu)的指令。

Go 的交叉編譯

我檢查了 Golang 的文檔,發(fā)現(xiàn)要生成 Arm64 二進(jìn)制文件,我要做的就是在運(yùn)行 go build 命令編譯 Go 程序之前設(shè)置兩個(gè)環(huán)境變量。

GOOS 指的是操作系統(tǒng),例如 Linux、Windows、BSD 等,而 GOARCH 指的是要在哪種架構(gòu)上構(gòu)建程序。

  1. $ env GOOS=linux GOARCH=arm64 go build -o prepnode_arm64 

構(gòu)建程序后,我重新運(yùn)行 file 命令,這一次它顯示的是 ARM AArch64,而不是之前顯示的 x86。因此,我在我的筆記本上能為不同的架構(gòu)構(gòu)建二進(jìn)制文件。

  1. $ file prepnode_arm64 
  2. prepnode_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped 

我將二進(jìn)制文件從筆記本電腦復(fù)制到 ARM 服務(wù)器上。現(xiàn)在運(yùn)行二進(jìn)制文件(將可執(zhí)行標(biāo)志打開(kāi))不會(huì)產(chǎn)生任何錯(cuò)誤:

  1. $ ./prepnode_arm64  -h 
  2. Usage of ./prepnode_arm64: 
  3.   -c    Clean existing installation 
  4.   -n    Do not start test run (default true
  5.   -s    Use stage environment, default is qa 
  6.   -v    Enable verbose output 

其他架構(gòu)呢?

x86 和 Arm 是我測(cè)試軟件所支持的 5 種架構(gòu)中的兩種,我擔(dān)心 Go 可能不會(huì)支持其它架構(gòu),但事實(shí)并非如此。你可以查看 Go 支持的架構(gòu):

  1. $ go tool dist list 

Go 支持多種平臺(tái)和操作系統(tǒng),包括:

  • AIX
  • Android
  • Darwin
  • Dragonfly
  • FreeBSD
  • Illumos
  • JavaScript
  • Linux
  • NetBSD
  • OpenBSD
  • Plan 9
  • Solaris
  • Windows

要查找其支持的特定 Linux 架構(gòu),運(yùn)行:

  1. $ go tool dist list | grep linux 

如下面的輸出所示,Go 支持我使用的所有體系結(jié)構(gòu)。盡管 x86_64 不在列表中,但 AMD64 兼容 x86-64,所以你可以生成 AMD64 二進(jìn)制文件,它可以在 x86 架構(gòu)上正常運(yùn)行:

  1. $ go tool dist list | grep linux 
  2. linux/386 
  3. linux/amd64 
  4. linux/arm 
  5. linux/arm64 
  6. linux/mips 
  7. linux/mips64 
  8. linux/mips64le 
  9. linux/mipsle 
  10. linux/ppc64 
  11. linux/ppc64le 
  12. linux/riscv64 
  13. linux/s390x 

處理所有架構(gòu)

為我測(cè)試的所有體系結(jié)構(gòu)生成二進(jìn)制文件,就像從我的 x86 筆記本電腦編寫一個(gè)微小的 shell 腳本一樣簡(jiǎn)單:

  1. #!/usr/bin/bash 
  2. archs=(amd64 arm64 ppc64le ppc64 s390x) 
  3. for arch in ${archs[@]} 
  4. do 
  5.         env GOOS=linux GOARCH=${arch} go build -o prepnode_${arch} 
  6. done 
  1. $ file prepnode_* 
  2. prepnode_amd64:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=y03MzCXoZERH-0EwAAYI/p909FDnk7xEUo2LdHIyo/V2ABa7X_rLkPNHaFqUQ6/5p_q8MZiR2WYkA5CzJiF, not stripped 
  3. prepnode_arm64:   ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=q-H-CCtLv__jVOcdcOpA/CywRwDz9LN2Wk_fWeJHt/K4-3P5tU2mzlWJa0noGN/SEev9TJFyvHdKZnPaZgb, not stripped 
  4. prepnode_ppc64:   ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=DMWfc1QwOGIq2hxEzL_u/UE-9CIvkIMeNC_ocW4ry/r-7NcMATXatoXJQz3yUO/xzfiDIBuUxbuiyaw5Goq, not stripped 
  5. prepnode_ppc64le: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), statically linked, Go BuildID=C6qCjxwO9s63FJKDrv3f/xCJa4E6LPVpEZqmbF6B4/Mu6T_OR-dx-vLavn1Gyq/AWR1pK1cLz9YzLSFt5eU, not stripped 
  6. prepnode_s390x:   ELF 64-bit MSB executable, IBM S/390, version 1 (SYSV), statically linked, Go BuildID=faC_HDe1_iVq2XhpPD3d/7TIv0rulE4RZybgJVmPz/o_SZW_0iS0EkJJZHANxx/zuZgo79Je7zAs3v6Lxuz, not stripped 

現(xiàn)在,每當(dāng)配置一臺(tái)新機(jī)器時(shí),我就運(yùn)行以下 wget 命令下載特定體系結(jié)構(gòu)的二進(jìn)制文件,將可執(zhí)行標(biāo)志打開(kāi),然后運(yùn)行:

  1. $ wget http://file.domain.com/<myuser>/bins/prepnode_<arch> 
  2. $ chmod +x ./prepnode_<arch> 
  3. $ ./prepnode_<arch> 

為什么?

你可能想知道,為什么我沒(méi)有堅(jiān)持使用 shell 腳本或?qū)⒊绦蛞浦驳?Python 而不是編譯語(yǔ)言上來(lái)避免這些麻煩。所以有舍有得,那樣的話我不會(huì)了解 Go 的交叉編譯功能,以及程序在 CPU 上執(zhí)行時(shí)的底層工作原理。在計(jì)算機(jī)中,總要考慮取舍,但絕不要讓它們阻礙你的學(xué)習(xí)。

責(zé)任編輯:未麗燕 來(lái)源: Linux.cn
相關(guān)推薦

2011-06-23 18:16:59

Qt Qtopia

2011-06-23 16:24:21

Qt Embedded 交叉編譯

2011-06-23 18:04:42

Qt Embedded

2010-02-24 16:49:24

Fedora SkyE

2011-07-05 16:31:17

Qtopia 交叉編譯

2010-03-02 10:55:47

Linux SkyEy

2011-06-28 13:47:37

Embedded QT ARM

2011-07-04 15:13:31

QT MPlayer 移植

2011-06-13 14:49:57

Qt Designer

2009-12-01 11:01:39

交叉編譯環(huán)境構(gòu)建

2019-11-15 15:20:27

Golang編譯器前端

2024-03-06 09:11:34

2021-09-06 13:15:16

golang chan技巧語(yǔ)言

2011-06-09 16:47:56

Qt 嵌入式

2021-06-07 23:19:44

Golang語(yǔ)言 Defer

2024-03-08 22:39:55

GolangApacheKafka

2021-04-28 09:02:48

Golang語(yǔ)言Context

2021-09-13 05:02:49

GogRPC語(yǔ)言

2019-10-11 10:44:30

Go語(yǔ)言數(shù)據(jù)庫(kù)軟件

2020-10-21 14:54:02

RustGolang開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)