Несколько dlopen и RTLD_NEXT - PullRequest
       44

Несколько dlopen и RTLD_NEXT

1 голос
/ 13 марта 2020

У меня есть исполняемый файл (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
...