Переносимость dlfunc? - PullRequest
       6

Переносимость dlfunc?

1 голос
/ 17 июля 2009

Я читаю man-страницу для dlopen и друзей на FreeBSD. Я работаю над кроссплатформенным приложением, которое использует разделяемые библиотеки для загружаемых плагинов. Я никогда не делал этого раньше, но я думаю, что у меня есть приличное представление о том, как это работает. На man-странице упоминается dlsym (), который, по-видимому, является общим средством получения указателя на функцию из разделяемой библиотеки, и dlfunc (), который предположительно избегает жалоб компилятора на приведение void * к указателю на функцию. Есть ли причина, по которой dlsym () более распространен (переносимость?)? Мне интересно, должен ли я использовать dlfunc (), чтобы избежать проблем с компилятором, или использовать dlsym (). Является ли dlfunc () переносимым?

Ответы [ 2 ]

3 голосов
/ 17 июля 2009

Вы не можете ожидать, чтобы dlfunc был предоставлен в других UNIX, но его реализация проста и переносима. Вы можете сделать что-то вроде

# configure.ac
AC_SYSTEM_EXTENSIONS
AC_CHECK_FUNCS([dlfunc])

// some common header
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, source/include/dlfcn.h */
struct __dlfunc_arg {
        int __dlfunc_dummy;
};
typedef void (*dlfunc_t)(struct __dlfunc_arg);
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol);
#endif

// some source file
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, lib/libc/gen/dlfunc.c */
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol) {
        union {
                void *d;
                dlfunc_t f;
        } rv;
        rv.d = dlsym(handle, symbol);
        return rv.f;
}
#endif

если вы используете Autoconf и другие системы сборки + конфигурации, вероятно, имеют аналогичные возможности. (dlsym гораздо более широко доступен.)


При этом, я думаю, что предупреждение компилятора глупо & ndash; Стандарт C этого не делает, но POSIX гарантирует, что указатели void * могут безопасно представлять все указатели функций & hellip;

1 голос
/ 17 июля 2009

Когда вы говорите о кроссплатформенности, вы имеете в виду кросс-платформенные платформы или вам также нужна поддержка Windows?

Если вы работаете в C ++, вы можете взглянуть на код предложения Boost.Extension . Это касается переносимости Windows и UNIX.

Если вам нужен совет только для UNIX, ознакомьтесь с Single UNIX Specification .

Насколько я знаю, dlsym - это стандартный UNIX-способ решения проблем. У Windows есть эквивалентный, но совершенно другой способ действий.

...