With some allocators (e.g. jemalloc), a circular dependency exists between malloc and libfaketime. When libfaketime triggers a malloc call while the initial malloc call is initializing, infinite recursion or a deadlock may occur. One of the causes is a malloc call by dlsym / dlvsym, when the requested symbol cannot be resolved. To avoid triggering this condition, this patch introduces a way to avoid dlsym / dlvsym calls under these conditions.
The feature consists of two environment variables:
First, launch faketime with the FAKETIME_DEBUG_DLSYM=1 environment variable to identify the non-resolving symbols:
$ FAKETIME_DEBUG_DLSYM=1 faketime 2024-03-12 date
[FAKETIME_DEBUG_DLSYM] Cannot find symbol: __ftime
[FAKETIME_DEBUG_DLSYM] Cannot find symbol: timer_settime@GLIBC_2.2
[FAKETIME_DEBUG_DLSYM] Cannot find symbol: timer_gettime@GLIBC_2.2
Tue Mar 12 12:00:00 AM CET 2024
Then, take the list of displayed symbols and concatenate them by a comma. Use this as the value for the FAKETIME_IGNORE_SYMBOLS environment variable:
FAKETIME_IGNORE_SYMBOLS=__ftime,timer_settime@GLIBC_2.2,timer_gettime@GLIBC_2.2 faketime 2024-03-12 date
For a detailed analysis that resulted in this PR, see https://github.com/wolfcw/libfaketime/issues/130#issuecomment-1989773770
With some allocators (e.g. jemalloc), a circular dependency exists between
malloc
and libfaketime. When libfaketime triggers amalloc
call while the initialmalloc
call is initializing, infinite recursion or a deadlock may occur. One of the causes is amalloc
call bydlsym
/dlvsym
, when the requested symbol cannot be resolved. To avoid triggering this condition, this patch introduces a way to avoiddlsym
/dlvsym
calls under these conditions.The feature consists of two environment variables:
First, launch
faketime
with theFAKETIME_DEBUG_DLSYM=1
environment variable to identify the non-resolving symbols:Then, take the list of displayed symbols and concatenate them by a comma. Use this as the value for the
FAKETIME_IGNORE_SYMBOLS
environment variable:FAKETIME_IGNORE_SYMBOLS=__ftime,timer_settime@GLIBC_2.2,timer_gettime@GLIBC_2.2 faketime 2024-03-12 date