成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

快速掌握 Go 二進制文件的靜態和動態鏈接

開發 前端
今天我們快速的介紹了 Go 語言中的靜態和動態鏈接的基本概念,打了個底。靜態鏈接會實現 ALL IN ONE 的效果,確保編譯出來的二進制文件能夠在標準的環境下運行。而動態鏈接則相反。

大家好,我是煎魚。

在編寫 Go 應用程序時,Go 本身提供了跨平臺編譯,提供了非常大的便利。但內部其實有許多靜態和動態鏈接的相關知識點。

今天給大家分享這一塊的基本知識。

如何選擇?Go 團隊的討論

Go 核心團隊在創造這門編程語言時已經做了大量的討論和權衡。

圖片圖片

“靜態鏈接有很多優點。部署簡單是其中之一。沒有版本問題是另一個優點(升級可能永遠不會破壞您的 go 二進制文件。但動態鏈接或解釋語言則不然,因為依賴關系可能會中斷)。啟動時間更快也是另一個優點。

不過,動態鏈接也有很好的理由。真實原因是:因為 go 作者已經研究了靜態鏈接與動態鏈接的權衡,并決定靜態鏈接更適合他們的用例。而且 go 社區中的大多數人都同意這一點。”

靜態和動態鏈接是什么?

靜態和動態鏈接是兩種不同的程序鏈接方式,一般會根據實際的程序運行情況進行選擇。

圖片圖片

靜態鏈接

在編譯時,鏈接器將程序所需的所有庫文件直接復制到可執行文件中,生成一個完整的可執行文件。

一旦生成后,執行時不再依賴外部庫。

  • 優點:簡單且不需要額外的庫文件。
  • 缺點:可執行文件較大,更新庫時需要重新編譯。

動態鏈接

在程序運行時,操作系統根據需要加載共享庫到內存中。

這使得可執行文件更小,因為它不包含所有的庫代碼,但程序執行時依賴于外部庫的存在。

  • 優點:在于節省內存和便于庫的更新。
  • 缺點:可能存在一些版本兼容性問題等。

快速例子

靜態鏈接

對于 Go 這一門編程語言而言,靜態鏈接是他大力宣傳的一個招牌:只需要編譯一個二進制文件,哪里都可以部署。

示例代碼如下:

package main

import (
 "fmt"
)

func main() {
 fmt.Println("腦子進煎魚了!")
}

輸出結果:

腦子進煎魚了!

強制指定 CGO_ENABLED=0 來進行編譯:

CGO_ENABLED=0 go build main.go

使用 file 工具查看目標文件信息:

$ file greet
greet: Mach-O 64-bit executable arm64

結合查看 fmt.Println 是否固定地址:

圖片圖片

結合來看,可以確定 Go 程序本身的依賴是靜態鏈接的。而編譯出來的二進制程序到底有沒有動態鏈接庫,取決于你所編寫的程序。

動態鏈接

Go 應用程序在進行 go build 的時候,可以加入 -buildmode 參數來指定構建模式,以此實現動態鏈接的目的。

以下是可用的 buildmode 選項:

  • archive: 將非 main 包構建成 .a 文件,main 包將被排除。
  • c-archive: 構建 main 包及其依賴的所有包為 C 歸檔文件。
  • c-shared: 構建指定的 main 包及其所有依賴為 C 動態庫。
  • shared: 將所有非 main 包整合到一個動態庫中。
  • exe: 構建指定的 main 包及其依賴為可執行文件,未命名為 main 的包將被忽略。

默認情況下,main 包會被內置到可執行文件中,非 main 包則會被內置到 .a 文件中。

這塊我們寫 Web 程序的用的不多,如果是寫 C 庫或者調第三方語言的動態庫時用得多。此時需要在編譯時指定 CGO_ENABLED=1 才可以。

有興趣的話,CGO 例子可以參考:andreiavrammsd/cgo-examples[1],這里不展開。

總結

今天我們快速的介紹了 Go 語言中的靜態和動態鏈接的基本概念,打了個底。靜態鏈接會實現 ALL IN ONE 的效果,確保編譯出來的二進制文件能夠在標準的環境下運行。而動態鏈接則相反。

這是 Go 這門編程語言設計時的一個招牌特性,而我們做 Web 開發的話,一般都是以靜態鏈接為主。

如果有涉及到第三方調用才會用到動態鏈接等。我見過用 CGO 逐步重構 C 服務的,甚至要慎防內存泄露。這時候又是另外一套邏輯、體系了,要進一步進修!

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2020-05-22 18:00:26

Go二進制文件編程語言

2022-07-26 13:00:01

安全符號源代碼

2009-08-12 18:06:53

C#讀取二進制文件

2009-12-16 10:49:42

Ruby操作二進制文件

2025-05-12 08:58:14

GoDWARF5二進制

2009-02-27 09:37:33

Google二進制代碼

2015-07-21 11:43:14

CentosRPM

2020-10-19 11:35:47

Ghidra逆向分析G

2009-12-10 09:24:50

PHP函數fwrite

2023-09-18 23:50:25

二進制文件裁剪Layout

2020-10-21 09:49:31

Ghidra逆向分析

2013-04-28 15:37:35

JBoss

2024-02-01 09:04:12

2025-04-02 11:30:00

MySQL二進制部署數據庫

2010-10-13 15:45:23

MySQL二進制日志

2022-01-26 00:02:01

Go二進制元信息

2017-04-11 10:48:53

JS二進制

2023-12-20 07:36:58

GoLinux語言

2018-10-22 14:37:16

二進制數據存儲

2022-10-31 08:02:42

二進制計算乘法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视视频在线观看入口直接观看 | 精品视频一区二区 | 亚洲一区二区电影在线观看 | 亚洲国产精品成人久久久 | 日韩电影一区 | 国产精品日韩欧美一区二区三区 | 免费一级毛片 | 99国产精品视频免费观看一公开 | 精品视频亚洲 | 在线播放一区二区三区 | 日韩精品福利 | 国产精品99久久久久久人 | 国精久久 | 国产人成精品一区二区三 | 成人免费久久 | 911精品国产 | 99视频久| 97色在线视频 | 亚洲精品在线观看视频 | 欧美日韩久| 99精品国产一区二区三区 | 在线成人av | 欧美成人精品 | 欧美电影网 | 九色综合网| 欧美日韩高清 | 国产二区在线播放 | 午夜视频精品 | 精品在线| 国产亚洲网站 | 欧美一级特黄aaa大片在线观看 | 午夜手机在线 | 国产精品欧美大片 | 亚洲精品一区中文字幕乱码 | 久久久久久久久久久久久久国产 | 日韩精品免费在线观看 | 亚洲精品成人 | 亚洲经典一区 | 午夜精品一区二区三区在线观看 | 国内精品免费久久久久软件老师 | 精品视频在线观看 |