c/c++语言开发共享如何从GNU / Linux中的可执行文件导出特定符号

在通过::dlopen()加载动态库时,可以通过-rdynamic选项从可执行文件导出符号,但它会导出可执行文件的所有符号,从而导致更大的二进制文件大小。

有没有办法只导出特定的function?

例如,我有testlib.cpp和main.cpp如下:

testlib.cpp

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

main.cpp中

 #include  #include  void func_export(int i) { ::fprintf(stderr, "%s: %dn", __func__, i); } void func_not_export(int i) { ::fprintf(stderr, "%s: %dn", __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: %sn", ::dlerror()); return 1; } func = reinterpret_cast(::dlsym(handle, "func_test")); if (func == NULL) { fprintf(stderr, "Unable to get symboln"); 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 ,则导出这两个函数。

如果没有链接g++ -o main_no_rdynamic -ldl main.og++ -o main_no_rdynamic -ldl main.o ,我得到运行时错误Unable to open lib: ./libtestlib.so: undefined symbol: _Z11func_exporti

是否有可能达到只导出特定function的要求?

    有没有办法只导出特定的function?

    我们需要此function,并在此处向Gold链接器添加了--export-dynamic-symbol选项。

    如果您正在使用Gold,请构建最新版本,您将全部完成。

    如果您不使用Gold,也许您应该 – 它更快,并且具有您需要的function。

      以上就是c/c++开发分享如何从GNU / Linux中的可执行文件导出特定符号相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549810.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐