wolfcw / libfaketime

libfaketime modifies the system time for a single application
https://github.com/wolfcw/libfaketime
GNU General Public License v2.0
2.62k stars 319 forks source link

Add FAKETIME_IGNORE_SYMBOLS to skip unneeded dlsym #463

Closed Rob--W closed 3 months ago

Rob--W commented 4 months ago

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 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