On 11/10/18 17:37, Mathieu Desnoyers wrote: > ----- On Oct 11, 2018, at 12:20 PM, Szabolcs Nagy Szabolcs.Nagy@xxxxxxx wrote: >> On 11/10/18 16:13, Mathieu Desnoyers wrote: >>> ----- On Oct 11, 2018, at 6:37 AM, Szabolcs Nagy Szabolcs.Nagy@xxxxxxx wrote: >>>> On 10/10/18 20:19, Mathieu Desnoyers wrote: >>>>> +__attribute__((visibility("hidden"))) __thread >>>>> +volatile struct libc_rseq __lib_rseq_abi = { >>>> ... >> but it's in a magic struct that's called "abi" which is confusing, >> the counter is not abi, it's in a hidden object. > > No, it is really an ABI between user-space apps/libs. It's not meant to be > hidden. glibc implements its own register/unregister functions (it does not > link against librseq). librseq exposes register/unregister functions as public > APIs. Those also use the refcount. I also plan to have existing libraries, e.g. > liblttng-ust and possibly liburcu flavors, implement the > registration/unregistration and refcount handling on their own, so we don't > have to add a requirement on additional linking on librseq for pre-existing > libraries. > > So that refcount is not an ABI between kernel and user-space, but it's a > user-space ABI nevertheless (between program and shared objects). > if that's what you want, then your declaration is wrong. the object should not have hidden visibility. then each library (glibc etc) will have its own separate tls object with their own separate refcounter (and they will unregister when their own refcounter hits 0) either the struct should be public abi (extern tls symbol) or the register/unregister functions should be public abi (so when multiple implementations are present in the same process only one of them will provide definition for the public abi symbol and thus there will be one refcounter).