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