【问题标题】:Golang c-archive with libc instead of glibc使用 libc 而不是 glibc 的 Golang c-archive
【发布时间】:2019-05-24 20:17:17
【问题描述】:

有可能吗?

我想从 C 程序调用以下 Go 函数:

// package name: test
package main

import "C"

//export Start
func Start() {
    println("Hello world")
}

func main() {
}

我正在使用以下命令来构建存档

go build -buildmode=c-archive -o test.a main.go

使用 gcc 我可以让这个 C 程序运行:

#include <stdio.h>
#include "test.h"

int main() {
  Start();
  return 0;
}

我正在使用以下命令来构建可执行文件:

gcc main.c sdlgotest.a -o main -lpthread

这一切都适用于 amd64,但我想在以 aarch64 为目标的开发环境中使用这个存档(使用 libtransistor)

libtransistor 构建系统使用 LLVM,但它有自己的一组标准包含(libc 等),并且不使用 glibc。

所以当我试图让 libtransistor 链接我的存档时,我收到以下错误:

/usr/lib/llvm-5.0/bin/ld.lld: error: undefined symbol: stderr
>>> referenced by gcc_libinit.c:29
>>>               000006.o:(x_cgo_sys_thread_create) in archive ./sdlgotest.a

/usr/lib/llvm-5.0/bin/ld.lld: error: undefined symbol: stderr
>>> referenced by gcc_libinit.c:29
>>>               000006.o:(x_cgo_sys_thread_create) in archive ./sdlgotest.a

顺便说一句,libtransistor 正在用这样的标志编译代码:

-nostdlib -nostdlibinc -isystem /opt/libtransistor/include/

所以我猜问题是链接器无法解析那些 glibc 符号。

有没有办法在没有那些 glibc 符号的情况下编译 Go 运行时,这样我就可以像我打算的那样使用存档? (不依赖 GCC 工具链或 glibc)

【问题讨论】:

标签: go linker cgo


【解决方案1】:

来自the docs:

默认的 C 和 C++ 编译器可以分别由 CC 和 CXX 环境变量更改;这些环境变量可能包括命令行选项。

所以我会尝试类似的东西

$ CC=clang go build -buildmode=c-archive -o test.a main.go

看看会发生什么。

【讨论】:

    【解决方案2】:

    运行go env 并查看设置的环境参数列表。您可以根据需要更改某些参数。

    以下是我用来从 go 程序构建共享 dll 的一些示例。

    GOARCH=386 GOOS=windows CGO_ENABLED=1 GOPATH=`pwd` CC=i686-w64-mingw32-gcc  go build -o go-shared-lib.dll -buildmode=c-shared go-shared-libs
    GOARCH=amd64 GOOS=windows CGO_ENABLED=1 GOPATH=`pwd` CC=x86_64-w64-mingw32-gcc  go build -o go-shared-lib.dll -buildmode=c-shared go-shared-libs
    

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2018-03-21
      • 2011-08-10
      • 2018-04-04
      • 1970-01-01
      • 2010-09-13
      • 2022-01-16
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多