LD_PRELOAD не обязательно является хорошим способом вставки системных вызовов, потому что а) он позволяет только перехватывать библиотечные вызовы и б) он позволяет только перехватывать библиотечные вызовы. ;)
A) Хотя в общем случае системные вызовы заключаются в общий libC в вашей системе, никто не мешает вам самим вызывать системный вызов, например, настроить правильное содержимое регистра и затем выполнить INT 0x80 в системе x86 , Если программа, которая вас интересует, делает это, вы никогда не поймаете тех, кто использует libc-interposition на основе LD_PRELOAD.
B) Хотя в целом большинство программ используют общую библиотеку libC в вашей системе для выполнения системных вызовов, иногда приложения статически связаны, что означает, что код libC является частью приложения и не поступает из разделяемой библиотеки lib. В таких случаях LD_PRELOAD также не помогает.
В комментарии уже предлагалось использовать strace / ltrace - мой общий совет - взглянуть на ptrace (), который используют оба эти инструмента и который должен дать вам то, что вы хотите, без необходимости изменения ядра.