<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60489>60489</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
thread specific key for __cxa_get_globals not destroyed on dlclose
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
k15tfu
</td>
</tr>
</table>
<pre>
Hi!
It turned out that a shared library with statically linked `libc++.a` and `libc++abi.a` leaks `pthread_key_t` handles when unloading by `dlclose()` and after a certain number of loading/unloading the `PTHREAD_KEYS_MAX` (or similar) limit is reached and we get `cannot create thread specific key for __cxa_get_globals()` error, here is demo app:
```
$ cat main.c
#include <dlfcn.h>
#include <stdio.h>
int main() {
for (int i = 0; i < 10000; ++i) {
void* library_handle = dlopen("/path/to/libsomelib.so", RTLD_LAZY | RTLD_LOCAL);
printf("%d dlopen = %p\n", i, library_handle);
dlclose(library_handle);
}
return 0;
}
$ cat somelib.cpp
#include <exception>
#include <stdexcept>
std::exception_ptr general_error = std::make_exception_ptr(std::runtime_error("General error"));
```
Build & run:
```
$ ./main
0 dlopen = 0x55ce993fd2a0
[...]
1022 dlopen = 0x55ce993fd2a0
1023 dlopen = 0x55ce993fd2a0
libc++abi: cannot create thread specific key for __cxa_get_globals()
```
Backtrace:
```
Process 26551 stopped
* thread #1, name = 'main', stop reason = signal SIGABRT
frame #0: 0x00007ffff781ce87 libc.so.6`__GI_raise(sig=2) at raise.c:51
(lldb) bt
error: libdl.so.2 0x00012adf: adding range [0x12c0-0x12d8) which has a base that is less than the function's low PC 0x16e0. Please file a bug and attach the file at the start of this error message
error: libdl.so.2 0x00012adf: adding range [0x12dc-0x12e1) which has a base that is less than the function's low PC 0x16e0. Please file a bug and attach the file at the start of this error message
* thread #1, name = 'main', stop reason = signal SIGABRT
* frame #0: 0x00007ffff781ce87 libc.so.6`__GI_raise(sig=2) at raise.c:51
frame #1: 0x00007ffff781e7f1 libc.so.6`__GI_abort at abort.c:79
frame #2: 0x00007ffff75aea06 libsomelib.so`abort_message + 198
frame #3: 0x00007ffff75cf2d8 libsomelib.so`__cxxabiv1::(anonymous namespace)::construct_() + 40
frame #4: 0x00007ffff738f907 libpthread.so.0`__pthread_once_slow + 183
frame #5: 0x00007ffff75cf1f4 libsomelib.so`__cxa_get_globals + 20
frame #6: 0x00007ffff75b0467 libsomelib.so`__cxa_throw + 23
frame #7: 0x00007ffff75ae01c libsomelib.so`std::exception_ptr std::make_exception_ptr<std::runtime_error>(std::runtime_error) + 76
frame #8: 0x00007ffff75adec8 libsomelib.so`__cxx_global_var_init + 40
frame #9: 0x00007ffff75adf09 libsomelib.so`_GLOBAL__sub_I_somelib.cpp + 9
frame #10: 0x00007ffff7de38d3 ld-linux-x86-64.so.2`___lldb_unnamed_symbol50$$ld-linux-x86-64.so.2 + 259
frame #11: 0x00007ffff7de839f ld-linux-x86-64.so.2`___lldb_unnamed_symbol81$$ld-linux-x86-64.so.2 + 1087
frame #12: 0x00007ffff794516f libc.so.6`__GI__dl_catch_exception(exception=0x00007fffffffe610, operate=(ld-linux-x86-64.so.2`___lldb_unnamed_symbol81$$ld-linux-x86-64.so.2), args=0x00007fffffffe630) at dl-error-skeleton.c:196
frame #13: 0x00007ffff7de796a ld-linux-x86-64.so.2`___lldb_unnamed_symbol79$$ld-linux-x86-64.so.2 + 186
frame #14: 0x00007ffff7bcff96 libdl.so.2`dlopen_doit(a=0x00007fffffffe860) at dlopen.c:66
frame #15: 0x00007ffff794516f libc.so.6`__GI__dl_catch_exception(exception=0x00007fffffffe800, operate=(libdl.so.2`dlopen_doit at dlopen.c:58), args=0x00007fffffffe860) at dl-error-skeleton.c:196
frame #16: 0x00007ffff79451ff libc.so.6`__GI__dl_catch_error(objname=0x00007ffff7dd20f0, errstring=0x00007ffff7dd20f8, mallocedp=0x00007ffff7dd20e8, operate=<unavailable>, args=<unavailable>) at dl-error-skeleton.c:215
frame #17: 0x00007ffff7bd0745 libdl.so.2`_dlerror_run(operate=(libdl.so.2`dlopen_doit at dlopen.c:58), args=0x00007fffffffe860) at dlerror.c:162
frame #18: 0x00007ffff7bd0051 libdl.so.2`__dlopen at dlopen.c:87
frame #19: 0x00007ffff7bd0030 libdl.so.2`__dlopen(file=<unavailable>, mode=<unavailable>)
frame #20: 0x000055555555471c main`main + 34
frame #21: 0x00007ffff77ffc87 libc.so.6`__libc_start_main(main=(main`main), argc=1, argv=0x00007fffffffe998, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fffffffe988) at libc-start.c:310
frame #22: 0x000055555555461a main`_start + 42
```
Clang 12.0.0
Linux x64
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWE1v4zjS_jXMhYhBUdbXwQc77vQ03ryYRk8fdvYiUGTJ4oQmDZLKx79fkJIT25LT25geYIPAkljkUx9PsYoSc07uNMAKZRuUbW9Y7ztjV49J5tv-pjHidfWbRDRBZIvIevj94rHvrQaBTe-x75jHDLuOWRBYycYy-4qfpe-w88xLzpR6xUrqRxAY5UTJhiO6QXSzYCgnmOmLYdbIQaKAPbogO_jOAhP1I7zWPkg6poUCh5870LjXyjAh9Q43r2G2UFwZB4iWiFZHDaz1YDHDHKxnUmPd7xuw2LR4XIzo_TuQ7yAgff3-27dP6239f5_-_KP-__W_AhiipbHYyb1UzCJaYSX30mPpsAXGOxBR3TPgHfiAwZnWxmNugXnAgyPYHYDLVnL8CK-4NRbXNX9h9Q58vVOmYcq9Ww_WGovoHe7AQtAjYG8wOxxQuj5lBeVk_B8e6RJz5vGeSb3gx7FUaq56ARild0K1XC86lH6akzovpDmVxl-pB8TBPIyKzTCOMY5-IFqGKRKjdIsJSjfx9g4nhJD4OFAszxc_GSkQXR-Tpx7ojRhCmQMM6iii9wfmO0TvvUH0XsnGmT0o2SycieI7_O37w7Z-WP_7T4yK49Pvd-uHEMv0xNbwd7BS-_YInYlRV1SLaHZA2Z0eYWX4ObfuFPEc9z3_rq8I81CxPVtuIeyqGLVx_G3CyOXRXX44zFEGLxwOXhp9ndJhygWpzouQS-n6DaA-eIt3oMEyVccEjFF5m7hnj1CfzUa0fJPaXnu5h3rM3BDfzwPWMZlpiMVpAC9yN_5ueqkERjTHttfvyT5N8wWi9zEp4wg55ZG8ZBmHqkpbQdlxSbZZLBYoG4ObEEp_tCQhNP3RnLMChtI1_ns7_4O4MP7oLeNwLSZfreHgHKZ5liXYeXM4gDiGa320BNE0CWmt2R7GnC-GrV2E4bAslDRnBpdDm2AK__Hl83rz7fuYsq2Ni2lKgsPkJezyom3btigTDmUR9gxfOLPIUU7q-vOX2jIZt4aTO5RuQx5g5nEcXXCUrrNjp6GlUqIJ8sYPQ0PupLFMCBVQ6aAyoUy0QcBErN6W6R1glG3IS0I5uQ0XEevVcyd5hzvmMMMNczA0L-mwCvHyHdOx9Le95nEf0cJhZZ7x1ztMXpIcyAJ_VRAWtlJBAOl3Q3vxnvFuWBwlPt47z6wPTcZ30g3Jj_fgHNvB3_FJ8OgTJP-TPv3iHMMB759LtNi5jujJFB2KNpmis8ZYHwDjTQQsqhlAegmYMWAkx-e9KycRph7DGJokTqpyBi-d4PGWinKCF6rKC2vkUzKUZERLpo1-3ZveRTbcIRSQUIKDmBvtvO25r4-NnW7wklzu8uWl9rRsKxKDPx7RQpBI1H88sxnNoXYh4aJXZXoJms24lLTLWZfOCmUEpBMj8wleQ5Z5cQXPd3Y0jaYz8S5m-CMJn4BdaaEfNczYj-caZvrpg2Y6UFPkl16XU0MF8CuJMUawfmK2llr6K3RXM5gtqaaYnx9-36wf6tr1Tf2lPjmlRODqEjeZbGIBaSlSrMStkrp_uX0p89t8GcthtLkOvaDudchcUbvXfWNURhBdIrqcWzQQmk01Tza4gDKt2p_TXCY_0JyQspirLpNqUC2zJG-n5aUWqubM8-49ZxAtT8532xOUtm0hT0goqOYAlnlA6Tb0z1_lUzys3WFmd25Gc0rG2irUbUzSW_cICrzRsSwmVT4XikkhE1BUOfs5IorqR0SUk42STIpYw9u2yk86cHyHDGe9WhjpQ-mcul3m726HqdHXfNbVSYH7ZayXZIb1K25cmJqVH7J66t5PsDqpvcHV9mNXx5cE0_wVqD03pRCCkjY6CdY6b8OL-syMMszYM6UMB3GYmQHlRaDSu16zJyYVaxTEkvsWihnZB5GgSTZJsUnXaAQpltl5itVCRbg6vN3Q8h8mMaoaqMvpHHWTBtIIQrLkwuZ6fAk6t2O-2k3aR0BMyTwiomU4ZF6jZm_EFdnsqeukwWTj37JI-PDpIifhEutDurzkjk46RNG2fHLADE91PAnX4-eQeInknSh5p4ejdJuM909TqqoqJmhoxtdC0Eotr8msV6L-aILzjD_WoMWM6rIcsyQ4dRudiqyGPj0TWzoT2zxhx9gOURlOFPSDt9g7xfQOJ3RBFuP4Qyjh-CVf3ohVKqq0YjewSvIiS_OySpc33aopRUPyqsjavMgKKNKSFcs8KXnJyLIt6I1cUUJTQgmlJMnS5aJijJRlWhVVVgIrUrQksGdSLZR62i-M3d1I53pY5WRZVjeKNaBc_BRKqYZnHIWIUpRtb-wqrLlt-p1DS6Kk8-4dxUuvYPVfv-NjbTwW4Lw1ryCw0cePRje9VavO-4OLh_Z7RO930nd9s-Bmj-h9UDhebg_W_AXcI3ofzXSI3kc3_hMAAP__Dz2HAw">