Building and linking dynamically from a go binary

前端 未结 5 1863
情书的邮戳
情书的邮戳 2020-12-13 02:51

My problem is the following:

  1. I have a go binary on a machine
  2. From that binary I need to compile an external .go file
  3. Once compiled, I need to
5条回答
  •  孤城傲影
    2020-12-13 03:34

    This is very possible, you can even compile it as a native shared library

    go build -buildmode=c-shared goc.go 
    
    # file goc
    goc: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV),
    dynamically linked, 
    BuildID[sha1]=f841e63ee8e916d7848ac8ee50d9980642b3ad86, 
    not stripped
    

    nm -D --defined-only ./goc | grep "T"

    0004ebe8 T _cgoexp_f88ec80374ab_PrintInt
    000a6178 T _cgo_panic
    0004e954 T _cgo_sys_thread_start
    000a48c8 T _cgo_topofstack
    0004e88c T _cgo_wait_runtime_init_done
    000a61a4 T crosscall2
    0004ebc8 T crosscall_arm1
    0004e7b0 T fatalf
    00102648 T _fini
    0004e544 T _init
    0004e76c T PrintInt
    0004ebe4 T __stack_chk_fail_local
    0004eb5c T x_cgo_free
    0004ea60 T x_cgo_init
    0004eb24 T x_cgo_malloc
    0004e8e0 T x_cgo_notify_runtime_init_done
    0004eb14 T x_cgo_setenv
    0004e820 T x_cgo_sys_thread_create
    0004eb64 T x_cgo_thread_start
    0004eb20 T x_cgo_unsetenv
    

    like so (tested on go 1.5.1 linux/arm)

    goc.go:

    package main
    
    import (
        "C"
        "fmt"
    )
    
    //export PrintInt
    func PrintInt(x int) {
        fmt.Println(x)
    }
    
    // http://stackoverflow.com/questions/32215509/using-go-code-in-an-existing-c-project
    // go build -buildmode=c-archive goc.go
    // go build -buildmode=c-shared goc.go 
    
    // https://groups.google.com/forum/#!topic/golang-nuts/1oELh6joLQg
    // Trying it on windows/amd64, looks like it isn't supported yet.  Is this planned for the 1.5 release? 
    // It will not be in the 1.5 release.
    // It would be nice if somebody worked on it for 1.6.
    // https://golang.org/s/execmodes
    
    // http://stackoverflow.com/questions/19431296/building-and-linking-dynamically-from-a-go-binary
    // go build -linkshared hello.g
    // go install -buildmode=shared std
    
    
    
    func main() {
        fmt.Println("Hello world")
    }
    

提交回复
热议问题