3

で動的ライブラリをロードしている間::dlopen()、オプションで実行可能ファイルからシンボルをエクスポートできますが-rdynamic、実行可能ファイルのすべてのシンボルをエクスポートするため、バイナリ サイズが大きくなります。

特定の関数だけをエクスポートする方法はありますか?

たとえば、次のように testlib.cpp と main.cpp があります。

testlib.cpp

extern void func_export(int i);

extern "C" void func_test(void)
{
  func_export(4);
}

main.cpp

#include <cstdio>
#include <dlfcn.h>

void func_export(int i)
{
  ::fprintf(stderr, "%s: %d\n", __func__, i);
}

void func_not_export(int i)
{
  ::fprintf(stderr, "%s: %d\n", __func__, i);
}

typedef void (*void_func)(void);

int main(void)
{
  void* handle = NULL;
  void_func func = NULL;
  handle = ::dlopen("./libtestlib.so", RTLD_NOW | RTLD_GLOBAL);
  if (handle == NULL) {
    fprintf(stderr, "Unable to open lib: %s\n", ::dlerror());
    return 1;
  }
  func = reinterpret_cast<void_func>(::dlsym(handle, "func_test"));

  if (func == NULL) {
    fprintf(stderr, "Unable to get symbol\n");
    return 1;
  }
  func();
  return 0;
}

コンパイル:

g++ -fPIC -shared -o libtestlib.so testlib.cpp
g++ -c -o main.o main.cpp

動的ライブラリで func_export を使用したいのですが、func_not_export を非表示にします。

-rdynamic, でリンクすると g++ -o main -ldl -rdynamic main.o 、両方の関数がエクスポートされます。

-rdynamic でリンクしないと、 g++ -o main_no_rdynamic -ldl main.o 実行時エラーが発生しましたUnable to open lib: ./libtestlib.so: undefined symbol: _Z11func_exporti

特定の関数のみをエクスポートするという要件を達成することは可能ですか?

4

1 に答える 1

4

特定の関数だけをエクスポートする方法はありますか?

この機能が必要だっ--export-dynamic-symbolたので、Gold リンカーにオプションを追加しまし

Gold を使用している場合は、最新バージョンをビルドすれば準備完了です。

Gold を使用していない場合は、Gold を使用する必要があります。これははるかに高速で、必要な機能を備えています。

于 2013-05-04T00:46:58.027 に答える