在Linux上是否有一个.def文件用于控制共享库中的导出函数名称?

我正在Ubuntu 9.10上构build一个共享库。 我只想从库中导出我的函数的一个子集。 在Windows平台上,这将使用模块定义( .def )文件来完成,该文件将包含从库导出的函数的外部和内部名称的列表。

我有以下问题:

  1. 我怎样才能限制共享库的导出function到我想要的(即.def文件等效)

  2. 使用.def文件作为例子,你可以给一个函数一个与其内部名称不同的外部名字(用于防止名称冲突,还可以重新装饰重名的名字等)

  3. 在Windows上,我可以使用EXPORT命令(IIRC)检查导出的函数和地址列表,在Linux上执行此操作的等效方法是什么?

在linux上的共享对象中仅使某些符号可见的最常见的方法是将-fvisibility=hidden传递给gcc,然后使用__attribute__((visibility("default")))装饰要显示的符号。

如果你正在寻找一个类似解决方案的导出文件,你可能想看看链接器选项--retain-symbols-file=FILENAME ,它可以做你正在寻找的东西。

我不知道从函数名称中导出一个与名称不同的函数的简单方法,但它可能是一个小精灵编辑器。 编辑:我想你可以使用链接脚本(查看ld的手册页)在链接步骤中将值分配给符号,从而为给定函数提供另一个名称。 请注意,我从来没有尝试过这个。

要查看共享对象中的可见符号,可以使用readelf命令。 如果我没有记错的话。

我怎样才能限制共享库的导出功能到我想要的(即.def文件等效)

也许你正在寻找GNU导出地图或符号版本

g++ -shared spaceship.cpp -o libspaceship.so.1 -Wl,-soname=libspaceship.so.1 -Wl, --version-script=spaceship.expmap

gcc也支持__declspec(dllexport)的VC语法。 看到这个

另一个选择是用这种方式使用strip命令:

 strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... \ libtotrip.so -o libout.so