Если речь идет только о конкретном системном вызове (не обо всех), вы можете переписать функцию-заглушку C и поместить ее в общую библиотеку и предварительно загрузить библиотеку перед выполнением целевого приложения, установив LD_PRELOAD.
Это приводит к тому, что ваша функция предпочтительнее функции, предоставляемой библиотекой C, когда динамический компоновщик разрешает вызовы функций.
Это работает только для динамически связанных приложений (почти всех), и вы должны быть двоично совместимы с используемой библиотекой C. Поскольку практически любой Linux использует glibc, а различные версии glibc совместимы с двоичными файлами, это не должно быть проблемой.
Вы можете посмотреть на fakeroot (как пример), как это сделать.
Добавить:
Вместо повторной реализации всей оболочки системного вызова, вы также можете перенаправить вызов фактической реализации в библиотеку C. Я предполагаю, что вам нужно вручную загрузить библиотеку и разрешить адрес (не уверен насчет этого, но в противном случае вы, вероятно, в конечном итоге позвоните себе).