Вы говорите, что a.dylib
зависит от b.dylib
, но b.dylib
не зависит от a.dylib
и что вы не хотите, чтобы вызовы в b.dylib
когда-либо вставлялись. Вы привели open
в качестве примера вставленной функции.
Я привел следующий пример: a.dylib
необходимо вызвать processFile
, который определен в b.dylib
, и он открывает файлы. Вы не хотите, чтобы вызов open
в b.dylib
был вставлен когда-либо (независимо от того, загружен a.dylib
или нет).
Единственный способ, которым я знаю, чтобы осуществить это, это для processFile
динамически загружать библиотеку C вместо того, чтобы ld
делал это автоматически.
При таком подходе есть две проблемы. Во-первых, каждая функция, которая должна вызывать open
, будет нуждаться в одном дополнительном операторе if
, чтобы выполнить код для разрешения символа.
Во-вторых, вам необходимо заранее знать имя файла C библиотека для загрузки. И если есть проблема с разрешением символа, то вам придется иметь дело с ситуацией, с которой не приходится сталкиваться большинству программ; по крайней мере, позже.
Код будет выглядеть примерно так:
void processFile (char * filename) {
FILE *fp;
// c_open can have file scope if thread safety isn't needed
static int (*c_open)() = NULL;
if (c_open == NULL) {
// factor this if more than one function needs open
void *dlh = dlopen(C_LIBRARY_FILENAME, RTLD_LAZY);
if (dlh == NULL) {
perror("cannot load C library");
exit(1);
}
c_open = dlsym(dlh, "open");
if (c_open == NULL) {
perror("cannot resolve open in the C library");
exit(1);
}
}
c_open(filename, O_RDONLY);
...
}
ОБНОВЛЕНИЕ
Если вы не укажете полный путь к библиотеке C, dlopen
может открыть неожиданный файл.