In /usr/include/execinfo.h, there are /* This function is similar to backtrace_symbols() but it writes the result immediately to a file and can therefore also be used in situations where malloc() is not usable anymore. */ extern void backtrace_symbols_fd (void *__const *__array, int __size, int __fd) __THROW __nonnull ((1)); The problem is stack bcktrace functions in glibc do dlopen (libgcc_s.so.1), which will call malloc. That is malloc will be always called no matter which function you use. Even if you build the executable with -shared-libgcc, dl_open_worker will call dl_map_object_deps which will call malloc. What dl_open_worker should do when a DSO to be dlopened is already on the DT_NEEDED list in the executable?
I changed the comment.