2

私には解決できない問題があります。これまでに見つけたものをすべて調べました。私の問題は、プログラムで dyn ライブラリを作成し、それを dlopen して、そのライブラリからメソッドを dlsym したいということです。

dlopen は機能しているようですが、dlsym はエラー " undefined symbol: method "を返します。

メソッド」は、dlsym に渡したメソッドの名前です。

ライブラリを作成する方法は次のとおりです。

execl("/usr/bin/gcc", "gcc", "-fPIC", "-Wall", "-g", "-c", "userinput.c", NULL);

と:

execl("/usr/bin/gcc", "gcc", "-ggdb3", "-shared", 
      "-Wl,-soname,libuserinput.so.1", "-o", "libuserinput.so.1.0",
  "userinput.o", "-lc", NULL);

コードを実行した後にライブラリがあるため、これは機能するはずです。

次のようにライブラリを開きます。

static void *my_load_dyn (const char *lib) {
static void *handle;
handle = dlopen ("./libuserinput.so.1.0", RTLD_NOW | RTLD_DEEPBIND);
if (handle == NULL) {
  printf ("error at dlopen(): %s\n", dlerror ());
  exit (EXIT_FAILURE);
}
return handle;
}

/* load func from dyn lib"*/
static void *my_load_func (void *handle, char *func) {
  void *funcptr = dlsym (handle, func);
  if (funcptr == NULL) {
    printf ("error at dlsym(): %s\n", dlerror ());
    exit (EXIT_FAILURE);
  }
  return funcptr;
}

これらの関数を次のように呼び出します。

void *libhandle;
void (*userMethod) (unsigned char *d);

libhandle = my_load_dyn(LIBUSERINPUT);
userMethod = my_load_func(libhandle, "testMethod");
(*userMethod)(d);

編集: userinput.c のコードは次のとおりです。

#include <stdio.h>
#include <unistd.h>
void testMethod(unsigned char *d)
{
d[0] = 'Z';
}

私のプログラムで生成され、実行中のプログラムでコンパイルおよびリンクされます

4

1 に答える 1

0

考えられる問題が 2 つあります

  • コードに問題があります

    でpublic関数methodとして宣言したことは確かですか?userinput.c

    たとえば、メソッドが宣言されている場合、static「外部」からアクセスすることはできません。関数をライブラリの外から見えないようにする方法は他にもありますが、コードを見ずにその問題が発生しているかどうかを判断することは不可能です。

  • ライブラリのコンパイル/リンクが壊れています

    たとえば、結果のライブラリにヘッダー ファイル ( userinput.h) をリンクしているように見えますか?

    問題が解決するまでは適切なビルド システムを使用し、後でオンザフライ コンパイルに切り替えることをお勧めします (例: を使用make) 。

于 2013-12-19T14:29:12.593 に答える