Вы можете обрабатывать некоторые динамические ссылки в самой вашей программе.В частности, прочитайте справочную страницу для dlsym (3) и dlopen (3), dlerror (3) и dlclose (3) для остального интерфейса динамического связывания.
Простой пример - скажем, Iхочу переопределить dup2 (2) из libc.Я мог бы использовать следующий код (назовем его «dltest.c»):
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>
int (*prev_dup2)(int oldfd, int newfd);
int dup2(int oldfd, int newfd) {
printf("DUP2: %d --> %d\n", oldfd, newfd);
return prev_dup2(oldfd, newfd);
}
int main(void) {
int i;
prev_dup2 = dlsym(RTLD_NEXT, "dup2");
if (!prev_dup2) {
printf("dlsym failed to find 'dup2' function!\n");
return 1;
}
if (prev_dup2 == dup2) {
printf("dlsym found our own 'dup2' function!\n");
return 1;
}
i = dup2(1,3);
if (i == -1) {
perror("dup2() failed");
}
return 0;
}
Компилировать с:
gcc -o dltest dltest.c -ldl
Статически связанная функция dup2 () переопределяет dup2 ()из библиотеки.Это работает, даже если функция находится в другом файле .c (и скомпилирована как отдельный .o).
Если ваши переопределяющие функции сами динамически связаны, вы можете использовать dlopen (), а не доверятькомпоновщик для получения библиотек в правильном порядке.
EDIT : Я подозреваю, что если другая функция в переопределенной библиотеке вызывает переопределенную функцию, то вызывается исходная функция, а не переопределение.Я не знаю, что произойдет, если одна динамическая библиотека вызывает другую.