簡體   English   中英

如何使用 cgo 交叉編譯 Solaris?

[英]How can I cross-compile for Solaris with cgo?

我正在嘗試為 Solaris 編譯一些cgo代碼。 嘗試構建時出現以下錯誤:

$ CGO_LDFLAGS="-L$(pwd)/solaris-11.4-amd64-libs" CGO_CFLAGS='-I/home/shane/src/ioctl-experimentation/solaris-11.4-headers -Wno-unknown-pragmas' CGO_ENABLED=1 GOOS=solaris GOARCH=amd64 go build
# runtime/cgo
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x16): undefined reference to `__libc_csu_fini'
/usr/bin/ld: (.text+0x1d): undefined reference to `__libc_csu_init'
/usr/bin/ld: (.text+0x2a): undefined reference to `__libc_start_main'
/usr/bin/ld: $WORK/b003/_x003.o: in function `_cgo_release_context':
gcc_context.c:(.text+0x5c): undefined reference to `__stack_chk_fail'
/usr/bin/ld: $WORK/b003/_x004.o: in function `x_cgo_sys_thread_create':
gcc_libinit.c:(.text+0x87): undefined reference to `__stack_chk_fail'
/usr/bin/ld: $WORK/b003/_x004.o: in function `_cgo_wait_runtime_init_done':
gcc_libinit.c:(.text+0x121): undefined reference to `__stack_chk_fail'
/usr/bin/ld: $WORK/b003/_x004.o: in function `_cgo_try_pthread_create':
gcc_libinit.c:(.text+0x291): undefined reference to `__stack_chk_fail'
/usr/bin/ld: $WORK/b003/_x006.o: in function `x_cgo_init':
gcc_solaris_amd64.c:(.text+0xb6): undefined reference to `__stack_chk_fail'
/usr/bin/ld: $WORK/b003/_x006.o:gcc_solaris_amd64.c:(.text+0x214): more undefined references to `__stack_chk_fail' follow
collect2: error: ld returned 1 exit status

我在 Linux 上進行交叉編譯。 這是我的 Go 版本:

$ go version
go version go1.18.3 linux/amd64

solaris-11.4-amd64-libs目錄包含來自 Solaris 11.4 AMD64 機器的/lib/amd64下所有文件的副本。 solaris-11.4-headers目錄包含來自 Solaris 11.4 AMD64 機器的/usr/include下所有文件的副本。

這是我在main.go中的 Go 代碼:

//go:build solaris
// +build solaris

package main

import "C"

func main() {
}

我知道從 Go 1.5 開始,Solaris 完全支持 cgo ,我正在使用 Go 1.18。

我正在尋求幫助來理解為什么會發生這些 linker 錯誤,即使我從/lib/amd64目錄復制了所有庫。 是否有可能我還需要從其他地方復制更多的庫?

我將假設 Solaris 需要libxnet ,這就是自動添加的原因。

首先用sudo find /lib libxnet*確認 libxnet 庫應該在哪里。 我希望您會看到 output 顯示的一行:

lib/64/libxnet.so

Assuming you see the above output, I believe you just need to tell the linker to look in that location with CGO_LDFLAGS="-L/lib/64" CGO_ENABLED=1 GOOS=solaris GOARCH=amd64 go build . 如果可行,那么您應該能夠將該 LDFlag 嵌入到您的main.go文件中:

// #cgo LDFLAGS: -L/lib/64
import "C"

嵌入后,您無需顯式設置CGO_LDFLAGS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM