その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

stringsを使ってどのgoのバージョンでコンパイルしたバイナリかをサクッと取得する

How to find out which Go version built your binary | Dave Cheney

stringsを使わないちゃんとしたやり方はこちら.


雑に取るならstringsコマンドを使うとそれっぽいのが取れます.

$ strings main | grep go1[.]
stack=[cgocheckdebugcpugo1.11.1runnableruntime.scavengeunknown( (forced) -> node= blocked= defersc= in use)

なるほど,これはgo1.11.1でコンパイルされたバイナリ.非常にスッキリしています.

$ strings main | grep go1[.]
, not 390625<-chanArabicAugustBrahmiCarianChakmaCommonCopticFridayGOROOTGothicHangulHatranHebrewHyphenKaithiKhojkiLepchaLycianLydianMondayRejangSCHED SundaySyriacTai_LeTangutTeluguThaana[]bytechan<-efenceerrno go1.11objectpopcntselectstringstructsweep uint16uint32uint64 (scan  (scan) MB in  Value> dying= locks= m->g0= nmsys= s=nil
/tmp/test/bin/go1.11
...

これは1.11でコンパイルされている様子.1.11.1と比べてごちゃごちゃ度が増していて,かつパス情報が下にずらずらと列挙されていますね.

$ strings main | grep go1[.]
stack=[cgocheckgo1.10.4runnableruntime.scavengeunknown( (forced) -> node= blocked= defersc= in use)
/tmp/test/bin/go1.10.4
...
Go cmd/compile go1.10.4

1.10.4です.1.11と比較してスッキリとした風味.パス情報が列挙されており,かつその下にはGo cmd/compile go1.10.4という非常にわかりやすい文字列が入っています.親切!

$ strings main | grep go1[.]
value=cs     float32float64fs     gctracego1.9.7gs     invalidpanic: r10    r11    r12    r13    r14    r15    r8     r9     rax    rbp    rbx    rcx    rdi    rdx    rflags rip    rsi    rsp    runningsyscalluintptrunknownwaiting goal
/Users/moznion/tmp/test/bin/go1.9.7/src/fmt/scan.go
...
Go cmd/compile go1.9.7

1.9.7も1.10.4と似ていますね.Go cmd/compileが付いていて良い時代.

$ strings main | grep go1[.]
value=cs     float32float64fs     gctracego1.8.7gs     invalidpanic: r10    r11    r12    r13    r14    r15    r8     r9     rax    rbp    rbx    rcx    rdi    rdx    reflectrflags rip    rsi    rsp    runningruntimesyscalluintptrunknownwaiting goal
/Users/moznion/tmp/test/bin/go1.8.7/src/fmt/doc.go
...

1.8.7のようです.Go cmd/compileが無いですね.つまりこのマーカーは1.9から1.10.xまでの短い命だったのですね……


というわけでサクッと取れて便利でした.