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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/71a81a80-c1e1-40a5-9337-1980affe22e4%40googlegroups.com.