Я работаю над использованием общей библиотеки, встроенной в golang, в скрипте Python (ctypes loadlibrary) в контейнере на основе альпийского языка.
Но это не так, как указано ниже,
/ usr / src /app # go build -o cc.so -buildmode = c-shared main.go
/ usr / src / app # readelf -d cc.so
Динамическая секция со смещением 0x10cd10 содержит 22 записи: Имя типа тега / значение 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libc.musl-x86_64.so.1] 0x0000000000000010 (SYMBOLIC) 0x0 0x000000000000000042000000000000000000000000000000 (INIT) 0 000 000 (INIT) 0 000 000 (INIT) 0 000 000 (INIT) 0 000) 0x92ed9 0x0000000000000019 (INIT_ARRAY) 0xa2078 0x000000000000001b (INIT_ARRAYSZ) 8 (байт) 0x000000006ffffef5 (GNU_HASH) 0x270 0x0000000000000005 (STRTAB) 0xa50 0x0000000000000006 (SYMTAB) 0x378 0x000000000000000a (STRSZ) +1026 (байт) 0x000000000000000b (SYMENT) 24 (байт) 0x0000000000000003 (PLTGOT)0x10deb0 0x0000000000000002 (PLTRELSZ) 720 (байты) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x41a00 0x0000000000000007(РЕЛА) 0xe58 0x0000000000000008 (RELASZ) 265128 (байт) 0x0000000000000009 (RELAENT) 24 (байт) 0x000000000000001e (ФЛАГИ) СИМВОЛИЧЕСКОЕ BIND_NOW STATIC_TLS 0x000000006ffffffb (FLAGS_1) Флаги: ТЕПЕРЬ NODELETE 0x000000006ffffff9 (RELACOUNT) 11040 0x0000000000000000 (NULL) 0x0
1015* / usr / src / app #
python test.py Трассировка (последний последний вызов): файл "test.py", строка 2, в lib = ctypes.cdll.LoadLibrary ('./ cc.so ') Файл "/usr/lib/python2.7/ctypes/init.py", строка 444, в LoadLibrary возвращает self._dlltype (name) файл "/usr/lib/python2.7/ctypes/init.py", строка 366, в init self._handle = _dlopen (self._name, mode) OSError: Ошибка перемещения ./cc.so:: initial-exec TLS преобразуется в динамическое определение в ./cc.so
Я попробовал следующие образы докера
Alpine 3.9 install go и python 2.7 на нем
go1.12: alpine и python2.7: alpine run go build для создания разделяемой библиотеки (перейдите в build -o cc.so -buildmode = c-shared main.go), затем скопируйте cc.so to python2.7: альпийский контейнер, запустите python test.py
Та же проблема.
Но если я использую образ ubuntu16.04 и устанавливаюпойти и Python, чтобы сделать тот же тест, он работает.
Main.go и test.py следующие,
//main.go
package main
import "C"
//export add
func add(left, right int) int {
return left + right
}
//export minus
func minus(left, right int) int {
return left - right
}
//export multiply
func multiply(left, right int) int {
return left * right
}
//export divide
func divide(left, right int) int {
return left / right
}
//export testPrint
func testPrint(){
print("test")
}
func main() {
}
// test.py
import ctypes
lib = ctypes.cdll.LoadLibrary('./cc.so')
if lib is not None:
print ("can load so")