C-архив Golang с libc вместо glibc - PullRequest
       36

C-архив Golang с libc вместо glibc

0 голосов
/ 26 декабря 2018

Возможно ли это?

У меня есть следующая функция Go, которую я хотел бы вызвать из программы на C:

// 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.

Есть ли способ скомпилировать среду выполнения Go без этих glibcсимволы, чтобы я мог использовать архив, как я собираюсь?(без использования GCC toolchain или glibc)

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Запустите go env и посмотрите список заданных параметров env.Вы можете изменить некоторые параметры в зависимости от того, что вам нужно.

Ниже приведены некоторые примеры, которые я использовал для создания совместно используемой библиотеки DLL из go.

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
0 голосов
/ 26 декабря 2018

С в документах :

Компиляторы C и C ++ по умолчанию могут быть изменены переменными среды CC и CXX соответственно;эти переменные окружения могут включать параметры командной строки.

Поэтому я попробую что-то вроде

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

и посмотрим, что произойдет.

...