У меня есть исполняемый файл (1) с двумя общими объектами (2 и 3), открытыми с использованием dlopen (..., RTLD_GLOBAL). Все файлы включают символ fun c ().
Если я использую dlsym (RTLD_NEXT, ...) в 1 в поисках следующего символа fun c (), возвращается символ 2. Но если в 2 я снова использую dlsym (RTLD_NEXT), символ не найден. Я думал, что будет возвращено 3 символа.
Что это значит?
Обновление : добавление примера
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef void (*next_t) (void);
static char *name[] = { "next" };
static char path[1024];
static next_t linc;
static void dlnext_open(int i)
{
sprintf(path, "./lib%d.so", i);
fprintf(stderr, "loading %d\n", i);
void *handler = dlopen(path, RTLD_GLOBAL | RTLD_NOW);
return;
}
int next()
{
fprintf(stderr, "NEXT %d\n", NUM);
#ifdef DLNUM1
dlnext_open(DLNUM1);
#endif
#ifdef DLNUM2
dlnext_open(DLNUM2);
#endif
linc = dlsym(RTLD_NEXT, name[0]);
if (linc != NULL) {
linc();
fprintf(stderr, "returning to %d\n", NUM);
} else {
fprintf(stderr, "no next\n");
}
}
#if NUM == 1
int main(int argc, char *argv[])
{
next();
return 0;
}
#endif
И make / exe c:
gcc -O0 -shared -fPIC -o lib3.so 1.c -DNUM=3
gcc -O0 -shared -fPIC -o lib2.so 1.c -DNUM=2
gcc -O0 -o 1 1.c -ldl -DNUM=1 -DDLNUM1=2 -DDLNUM2=3
./1
Результат:
NEXT 1
loading 2
loading 3
NEXT 2
no next
returning to 1