Невозможно вызвать указатель на функцию, возвращающую указатель - PullRequest
3 голосов
/ 06 августа 2010

Я застрял со странной проблемой.У меня есть два файла ac и bc следующим образом: bc:

#include <stdlib.h>

int *foo() {
  int *x;
  x = (int *) malloc(sizeof(int));
  *x = 4;
  return x;
}

Я компилирую bc в b.so, используя gcc: $ gcc -o b.so -shared -fpic

ac:

#include <stdio.h>
#include <dlfcn.h>

int main() {
  void *hdl;
  hdl = dlopen("./b.so", RTLD_LAZY);
  int *((*fn)(void));
  int *x;
  x = (*fn)();
  fn = dlsym(hdl, "foo");
  printf("%d", *x);
}

Я компилирую переменную, используя gcc:

$ gcc -fpic -ldl ac

Теперь, когда я его запускаю:

$ ./a.out Ошибка сегментации

Куда я иду не так?Это работает, когда функция в bc не возвращает указатель.

И более того, я попытался проверить наличие ошибок с помощью dlerror (), но ничего не сообщает.

Ответы [ 4 ]

6 голосов
/ 06 августа 2010

При проверке вы используете fn до того, как инициализируете его.Это еще не указывает на foo, это еще не указывает ни на что конкретно, и я подозреваю, что результирующее поведение не определено.

4 голосов
/ 06 августа 2010

Вы не находите символ и не вызываете функцию.

Когда вы делаете x = (*fn)();, она не вызывает функцию foo из b.c.

.сначала загрузите символ в указатель на функцию.

  int *x;
  fn = dlsym(hdl, "foo");
  x = fn();
  printf("%d", *x);

Выше должно работать.

РЕДАКТИРОВАТЬ:

Пример программы для dlopen, dlsym можно найти здесь с информацией о странице руководства для того же.

3 голосов
/ 06 августа 2010

Эти две строки отображаются в неправильном порядке:

x = (*fn)();
fn = dlsym(hdl, "foo");
3 голосов
/ 06 августа 2010

Может быть просто проблема с вашим примером, но в предоставленном вами коде вам необходимо переключить следующие строки:

 x = (*fn)();
fn = dlsym(hdl, "foo");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...