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までの短い命だったのですね……
というわけでサクッと取れて便利でした.