On Friday, April 12, 2019 at 1:21:25 PM UTC+12, Chao Chen wrote: > Do you any progress to solve the problem? I meet the same problem. > > > when I call golang build shared library on python from alpine 3.9 > container.failed with OSError: Error relocating ./cc.so: : initial-exec TLS > resolves to dynamic definition in ./cc.so > > > > > > > > > > > > > /usr/src/app # go build -o cc.so -buildmode=c-shared main.go > > > > > /usr/src/app # readelf -d cc.so > > > > > Dynamic section at offset 0x10cd10 contains 22 entries: > > Tag Type Name/Value > > 0x0000000000000001 (NEEDED) Shared library: [libc.musl-x86_64.so.1] > > 0x0000000000000010 (SYMBOLIC) 0x0 > > 0x000000000000000c (INIT) 0x42000 > > 0x000000000000000d (FINI) 0x92ed9 > > 0x0000000000000019 (INIT_ARRAY) 0xa2078 > > 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) > > 0x000000006ffffef5 (GNU_HASH) 0x270 > > 0x0000000000000005 (STRTAB) 0xa50 > > 0x0000000000000006 (SYMTAB) 0x378 > > 0x000000000000000a (STRSZ) 1026 (bytes) > > 0x000000000000000b (SYMENT) 24 (bytes) > > 0x0000000000000003 (PLTGOT) 0x10deb0 > > 0x0000000000000002 (PLTRELSZ) 720 (bytes) > > 0x0000000000000014 (PLTREL) RELA > > 0x0000000000000017 (JMPREL) 0x41a00 > > 0x0000000000000007 (RELA) 0xe58 > > 0x0000000000000008 (RELASZ) 265128 (bytes) > > 0x0000000000000009 (RELAENT) 24 (bytes) > > 0x000000000000001e (FLAGS) SYMBOLIC BIND_NOW STATIC_TLS > > 0x000000006ffffffb (FLAGS_1) Flags: NOW NODELETE > > 0x000000006ffffff9 (RELACOUNT) 11040 > > 0x0000000000000000 (NULL) 0x0 > > > > > /usr/src/app # python test.py > > Traceback (most recent call last): > > File "test.py", line 2, in > > lib = ctypes.cdll.LoadLibrary('./cc.so') > > File "/usr/lib/python2.7/ctypes/init.py", line 444, in LoadLibrary > > return self._dlltype(name) > > File "/usr/lib/python2.7/ctypes/init.py", line 366, in init > > self._handle = _dlopen(self._name, mode) > > OSError: Error relocating ./cc.so: : initial-exec TLS resolves to dynamic > definition in ./cc.so It looks like there was some recent activity that relates to both your musl compiler issue and my original issue: https://github.com/golang/go/issues/29674
This is specifically targeting Android issues it seems. I stopped trying to use Go C shared libraries in C++ libs/plugins after this post, since it couldn't cope with large shared plugin environment platforms where there was a race to a limited amount of static TLS slots. But now this is becoming relevant for me again with the new work being done in gopy to generate python extensions: https://github.com/go-python/gopy/pull/180 > On Wednesday, May 25, 2016 at 7:14:02 AM UTC+8, Justin Israel wrote: > I've got one more question, related to this process, now that this library is > seeing some production use... > > > The C++ Go binding shared library is being used as a dependency in another > library. This other library is a plugin that gets loaded via dlopen. I am > seeing the following: > > > dlopen: cannot load any more object with static TLS > > > In doing some research, I found that this happens when shared libs default or > use "-ftls-model=initial-exec" and/or don't use "-fpic". So it a situation of > the big pool of plugins that get dlopen'd into this particular application, > and the static TLS slots running out when enough of them use initial-exec. > > > I was looking at my shared lib that is created via "go build > -buildmode=c-shared -gcflags=-shared -asmflags=-shared -installsuffix=_shared > -a" and I do see it using "-fPIC". After doing some SO research, someone > suggested doing the following to determine the TLS mode that is being used: > > > http://stackoverflow.com/questions/22983986/is-there-a-way-to-determine-thread-local-storage-model-used-by-a-library-on-linu > > > > $ readelf -d libgofileseq.so | grep FLAGS > ... (FLAGS) SYMBOLIC STATIC_TLS > > > > It seems no combination of trying to add "-ftls-model=global-dynamic" to my > compile process can resolve the problem. Are there any suggestions of where > this change can be applied, to correct the situation where dlopen fails? We > have found that if this plugin using this shared library gets loaded first, > then we don't encounter the static TLS failure. > > > Justin > > > > > > On Wednesday, May 18, 2016 at 3:11:57 PM UTC+12, Justin Israel wrote: > I'm wondering if someone can tell me if this is either a limitation of > buildmode=c-archive static libs, or if I am really just doing something wrong. > > > Problematic steps: > export functions to libgofoo.a using buildmode=c-archive > statically link libgofoo.a into another library to produce libfoo.aSomeone > else consumes libfoo.a and libgofoo.a in their library, and get linker errors > about: > ld: libgofoo.a(go.o): relocation R_X86_64_TPOFF32 against `runtime.tlsg` can > not be used when making a shared object; recompile with -fPIC > libgofoo.a: could not read symbols: Bad value > > But library that wants to consume these libs can do so if they dynamically > link with shared libs from c-shared. Also, if the consumer of the libs is a > main binary, then the static linking works and does not complain. It is only > when the target is a library. > > > I could swear I went through and ensured -fPIC was being used, but it didn't > seem to make a difference. Am I infact just messing up my compilation > settings and failing to add this flag as it suggests, or is there a known > limitation related to the steps I have outlined? > > > Thanks! > Justin -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/71a81a80-c1e1-40a5-9337-1980affe22e4%40googlegroups.com.