LINUX.ORG.RU

gcc-go генерирует большие бинарники со сторонними зависимостями

 ,


0

2

Собственно, сабж. Если компилирую, допустим, программу такого вида (отсюда):

package main

import (
    "fmt"
    "log"
    "net/http"
)

func formHandler(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Fprintf(w, "ParseForm() err: %v", err)
        return
    }
    fmt.Fprintf(w, "POST request successful")
    name := r.FormValue("name")
    address := r.FormValue("address")
    fmt.Fprintf(w, "Name = %s\n", name)
    fmt.Fprintf(w, "Address = %s\n", address)
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/hello" {
        http.Error(w, "404 not found.", http.StatusNotFound)
        return
    }

    if r.Method != "GET" {
        http.Error(w, "Method is not supported.", http.StatusNotFound)
        return
    }


    fmt.Fprintf(w, "Hello!")
}


func main() {
    fileServer := http.FileServer(http.Dir("./static"))
    http.Handle("/", fileServer)
    http.HandleFunc("/form", formHandler)
    http.HandleFunc("/hello", helloHandler)


    fmt.Printf("Starting server at port 8080\n")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

То размер бинарника радует глаз:

[alexey@ssh test]$ go build -gccgoflags '-s -w' main.go
[alexey@ssh test]$ ls -alh main
-rwxr-xr-x 1 alexey users 59K Dec  4 15:05 main

Но если Я беру что-что вроде этого (отсюда):

package main

import (
  "net/http"

  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "pong",
    })
  })
  r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

То бинарник выходит уж слишком большим:

[alexey@ssh test]$ go build -gccgoflags '-s -w' main.go
[alexey@ssh test]$ ls -alh main
-rwxr-xr-x 1 alexey users 11M Dec  4 15:02 main

Размер почти такой же, как и при компиляции обычным go компилятором, не GCC. Для echo такая же проблема.

Что я делаю не так?

Сначала определись, тебе шашечки или ехать? Так ли важен размер?

Ну а так, stdlib минимален и не плохо оптимизирован. А что там в джин напихали одному джину известно.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

Навскидку: в первом случае у тебя штатные средства Go, во второй ты упаковываешь туда аж целый Gin, который тянет за собой тонную зависимостей, скорее всего. Посмотри в go.mod, сколько ему там всего нужно для работы.

Zhbert ★★★★★
()
5 февраля 2023 г.

Спасибо за ответы. У gin-а оказалось действительно очень много библиотек, из-за чего у него такой большой бинарник.

Дополнительно выяснилось, что gcc-go компилирует большие статические бинарники (скомпилировано из первого примера):

alexey@deb1:~$ go build -gccgoflags '-static -s -w' main.go
alexey@deb1:~$ ls -alh main
-rwxr-xr-x 1 alexey alexey  12M Feb  5 02:09 main
alexey@deb1:~$ go build -gccgoflags '-static-libgo -s -w' main.go
alexey@deb1:~$ ls -alh main
-rwxr-xr-x 1 alexey alexey  15M Feb  5 02:10 main
ktifhfl
() автор топика