Вы можете создать библиотеку-оболочку, которая будет перехватывать все вызовы на setsockopt
и сможет изменять некоторые параметры. Это работает, если ваше приложение имеет вызов setsockopt. В другом случае вы можете обернуть другую функцию, например, socket
используя тот же подход. В оболочке socket
вам нужно создать сокет с __socket, а затем изменить любой параметр, который вы хотите.
Библиотека Wrapper должна быть динамической, с функцией setsockopt
. Эта функция может быть перегружена с помощью glibc. Затем запустите вашу программу следующим образом:
LD_PRELOAD=path_to_wrapper_library/libwrap.so ./you_program
Библиотека будет вставлена (связана) в программу и заменит функцию setsockopt.
Это работает только с динамически связанными программами (отметьте это с помощью ldd ./you_program
- будет некоторое /lib/*.so, если оно динамически связано).
Исходную функцию можно вызвать из вашего кода с префиксом __
: __setsockopt
или с использованием dlsym(RTLD_NEXT, "setsockopt");
.
Некоторые примеры (не setsockopt, а идея предварительной загрузки оболочки): http://scaryreasoner.wordpress.com/2007/11/17/using-ld_preload-libraries-and-glibc-backtrace-function-for-debugging/ или http://developers.sun.com/solaris/articles/lib_interposers_code.html
Компилировать в динамическую библиотеку с:
gcc wrap.c -fPIC -shared -ldl -o libwrap.so