<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go1.18 新特性:編譯后的二進(jìn)制文件,將包含更多信息

          共 1896字,需瀏覽 4分鐘

           ·

          2022-02-20 05:21

          大家好,我是煎魚。

          我有一個(gè)朋友,,開開心心入職,想著施展拳腳,第一個(gè)任務(wù)就是對(duì)老舊的二進(jìn)制文件進(jìn)行研究。

          他一看,這文件,不知道是編譯器用什么參數(shù),是怎么編譯出來的,環(huán)境不知道是什么,更不知道來自什么代碼分支?

          這除了是項(xiàng)目流程上的問題外,Go 在這塊也有類似的小問題,處理起來比較麻煩。

          背景

          日常中很難從 Go 二進(jìn)制文件中檢索元信息,要么是信息完全缺失,要么提取需要對(duì)二進(jìn)制文件進(jìn)行大量解析。

          包含的元信息如下:

          元信息提取處
          Go 構(gòu)建版本符號(hào)表,通過全局變量 runtime.buildVersion 來獲取
          構(gòu)建信息,例如:模塊和版本符號(hào)表,通過全局變量 runtime/debug.modinfo 來獲取
          編譯器選項(xiàng),例如:構(gòu)建模式、編譯器、gcflags、ldflags 等無法獲取
          用戶定義的自定義數(shù)據(jù),例如:應(yīng)用程序版本等需在編譯時(shí)設(shè)置全局字符串變量,才可以獲取

          關(guān)注到編譯器選項(xiàng),也就是參數(shù)等都是無法得知的,也就是會(huì)提高獲取如何編譯出來的難度。

          新提案

          Michael Obermüller 提出了一個(gè)新的提案《cmd/go: add compiler flags, relevant env vars to 'go version -m' output》用于解決上述問題。

          在提案中想要的是 JSON 格式的結(jié)構(gòu)輸出:

          {
          ????"version":?"go1.13.4",
          ????"compileropts":?{
          ????????"compiler":?"gc",
          ????????"mode":?"pie",
          ????????"os":?"linux",
          ????????...
          ????},
          ????"buildinfo":?{
          ????????"path":?"腦子進(jìn)煎魚了",
          ????????"main":?{
          ????????????"path":?"HelloWorld",
          ????????????"version":?"(devel)",
          ????????},
          ????????"deps":?[]
          ????},
          ????"user":?{
          ????????"customkey":?"customval",
          ????????...
          ????}
          }

          Russ Cox 表示由于編譯信息已有既有格式,并且默認(rèn)使用 JSON 只會(huì)讓二進(jìn)制文件變得更大。好處少,沒必要,改為了選項(xiàng)化的支持。

          新的 Go1.18 版本中,可以通過既有的:

          go?version?-m

          查看到提案所提到的信息。

          例如:

          $?gotip?version
          go?version?devel?go1.18-eba0e866fa?Mon?Oct?18?22:56:07?2021?+0000?darwin/amd64
          $?gotip?build?./
          $?gotip?version?-m?ko
          ...
          ?build?compiler?gc
          ?build?tags?goexperiment.regabiwrappers,goexperiment.regabireflect,goexperiment.regabiargs
          ?build?CGO_ENABLED?true
          ?build?CGO_CPPFLAGS?
          ?build?CGO_CFLAGS?
          ?build?CGO_CXXFLAGS?
          ?build?CGO_LDFLAGS?
          ?build?gitrevision?6447264ff8b5d48aff64000f81bb0847aefc7bac
          ?build?gituncommitted?true

          若需要輸出 JSON 格式,也可以通過指定 go version -json 達(dá)到一樣的效果。

          在上面的輸出中,現(xiàn)有的編譯器選項(xiàng)等都會(huì)包含在內(nèi),能夠讓大家對(duì)整體編譯后的二進(jìn)制文件溯源有一個(gè)更好的認(rèn)知。

          總結(jié)

          在今天這篇文章中,給大家介紹了 Go1.18 的一個(gè)新的變化。

          新版本中,編譯器選項(xiàng)/參數(shù)、相關(guān)環(huán)境變量等,將會(huì)包含在編譯后的二進(jìn)制文件中,能夠更便于后人排查和查看信息。


          關(guān)注煎魚,獲取業(yè)內(nèi)第一手消息和知識(shí) ??



          你好,我是煎魚,出版過 Go 暢銷書《Go 語言編程之旅》,再到獲得 GOP(Go 領(lǐng)域最有觀點(diǎn)專家)榮譽(yù),點(diǎn)擊藍(lán)字查看我的出書之路。

          日常分享高質(zhì)量文章,輸出 Go 面試、工作經(jīng)驗(yàn)、架構(gòu)設(shè)計(jì),加微信拉讀者交流群,和大家交流!

          瀏覽 71
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  影音先锋黄色资源 | 秋霞无码av | 禁片天堂免费网址 | 学生妹一级片,黄色的学生妹一级片 | 日本1234区在线观看 |