0

GoのHello worldは次のとおりです。

package main                                                                                                                                               

import (                                                                      
  "fmt"                                                                    
  )                                                                         

func main() {                                                                 
        fmt.Println("Go is great!")                                           
}

それを入れて、次のようhello.goにコンパイルします。

  • go build -o hello_go_build hello.go
  • go build -o hello_go_build_gccgo --compiler gccgo hello.go
  • gccgo -o hello_gccgo_shared hello.go
  • gccgo -static -o hello_gccgo_static hello.go

まず、サイズが違うことhello_go_build_gccgoに気づきました。hello_gccgo_sharedインターネットで情報を探しましたが、うまくいきませんでした。それがなぜなのか誰か知っていますか?またはさらに良いことに、それを理解する方法を誰か教えてくれませんか? フラグを付けて一時ファイルを保持しようとしました-workが、関連する情報を見つけることができませんでした。

次に、お気づきかもしれませんが、静的にリンクされた 2 つのバイナリも同じサイズではありません。実際、go build( hello_go_build) コマンドでコンパイルされたものは、私のシステムだけでなく、他の Linux ディストリビューションを使用する他のシステムでも機能しますが、私のシステムだけでなく他のシステムでもhello_go_build_gccgoエラーで失敗します。

panic: runtime error: invalid memory address or nil pointer dereference

これは解決しようとしているバグです: https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/y2RIy0XLJ24

最後に、今日ではサイズはもはや問題ではありませんが、私は興味があります:関数レベルのリンクを行うためのgoコンパイラの誰かとのオプションはありますか(パッケージ全体を静的にリンクする代わりに、必要な関数とその依存関係のみをリンクします) )?

4

1 に答える 1

2

まず、hello_go_build_gccgo と hello_gccgo_shared が同じサイズではないことに気付きました。インターネットで情報を探しましたが、うまくいきませんでした。それがなぜなのか誰か知っていますか?

サイズが同じだったらおかしいと思います。1 つは静的にリンクされ、もう 1 つは共有ライブラリを使用します。

次に、お気づきかもしれませんが、静的にリンクされた 2 つのバイナリも同じサイズではありません。

サイズが同じだったらおかしいと思います。1 つは によってコンパイルされgc、もう 1 つはgccgo2 つの完全に異なるコンパイラによってコンパイルされます。同じサイズのバイナリを生成する必要があるのはなぜですか?

最後に、今日ではサイズはもはや問題ではありませんが、私は興味があります: 関数レベルのリンクを行うために go コンパイラの誰かにオプションはありますか (パッケージ全体を静的にリンクする代わりに、必要な関数とその依存関係のみをリンクします) )?

で「パッケージ全体を静的にリンクする」というようなことはありませんgc。未使用の関数 (関数だけでなく) は、バイナリには存在しません。そして、IIRC、それは初日からそうでした(公開リリースから数えて)。上記が当てはまるかどうかはわかりませんgccgoが、これでも同じようにうまくいくと思います.

于 2013-02-04T11:08:28.143 に答える