Эквивалент Delay-Load в системах на основе Unix - PullRequest
7 голосов
/ 02 июня 2010

Что такое задержка нагрузки эквивалент в Unix-системах.

У меня есть код foo.cpp, при компиляции с помощью gcc я связываю его с общими объектами (всего три .so файла.). Каждый из .so файла для другой вариант.

./foo -v нужно libversion.so ./foo -update нужно libupdate.so

Мне нужно, чтобы символ для этих библиотек разрешался только во время выполнения.

./foo -v не должен ломаться, даже если библиотеки libupdate.so нет.

Работает в окнах, используя опцию отложенной загрузки (в свойствах dll). Каков его эквивалент в системах Unix.

Будет ли опция -lazy делать то же самое в UNIX? Если да, где включить эту опцию: в make-файле или с компоновщиком ld?

Ответы [ 2 ]

3 голосов
/ 02 июня 2010

См. Ссылку на вашу систему для dlopen (). Вы можете вручную открывать библиотеки и разрешать внешние символы во время выполнения, а не во время ссылки.

Выкопал пример:

int main(int argc, char **argv) {                 
    void *handle=NULL;                                 
    double (*myfunc)(double);                     
    char *err=NULL;                                  

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY);
    if (!handle) {                                
        err=dlerror();
        perror(err);
        exit(1);                                  
    }                                             

    myfunc = dlsym(handle, "sin");                
    if ((err = dlerror()) != NULL)  {           
        perror(err);
        exit(1);                                  
    }                                             

    printf("sin of 1 is:%f\n", (*myfunc)(1.));              
    dlclose(handle);            
    return 0;                  
}                                                 
1 голос
/ 16 февраля 2018

Я знаю, что прошло 8 лет, но все же ...

Задержка загрузки не поддерживается из коробки в системах GNU, но вы можете имитировать ее самостоятельно, создав небольшую статическую заглушку, которая предоставляет все необходимые символы и реальную реализацию dlopen при первом вызове (или даже при запуске программы). Такая заглушка может быть написана вручную, сгенерирована специфичным для проекта скриптом или с помощью инструмента Implib.so :

# Replace
$ gcc -o foo foo.c -lversion
# with
$ implib-gen.py libversion.so
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c
...