Почему вы не можете / не хотите использовать трюк LD_PRELOAD ?
Пример кода здесь:
/*
* File: soft_atimes.c
* Author: D.J. Capelis
*
* Compile:
* gcc -fPIC -c -o soft_atimes.o soft_atimes.c
* gcc -shared -o soft_atimes.so soft_atimes.o -ldl
*
* Use:
* LD_PRELOAD="./soft_atimes.so" command
*
* Copyright 2007 Regents of the University of California
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);
int open(const char * pathname, int flags, mode_t mode)
{
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
if(flags & O_CREAT)
return _open(pathname, flags | O_NOATIME, mode);
else
return _open(pathname, flags | O_NOATIME, 0);
}
int open64(const char * pathname, int flags, mode_t mode)
{
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
if(flags & O_CREAT)
return _open64(pathname, flags | O_NOATIME, mode);
else
return _open64(pathname, flags | O_NOATIME, 0);
}
Из того, что я понимаю ... это в значительной степени трюк LD_PRELOAD или модуль ядра. Существует не так много промежуточного положения, если вы не хотите запустить его под эмулятором, который может перехватить вашу функцию или переписать код в самом двоичном файле, чтобы перехватить вашу функцию.
Предполагая, что вы не можете модифицировать программу и не можете (или не хотите) изменять ядро, подход LD_PRELOAD является лучшим, предполагая, что ваше приложение довольно стандартное и на самом деле не является тем, которое злонамеренно пытается чтобы пройти ваш перехват. (В этом случае вам понадобится один из других методов.)