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

mor*_*ous 14 c c++ ubuntu shared-libraries

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

我有以下问题:

  1. 如何将共享库的导出函数限制为我想要的(即等效的.def文件)

  2. 以.def文件为例,您可以为函数提供一个与其内部名称不同的外部名称(对于防止名称冲突和重新修饰损坏的名称等非常有用)

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

CB *_*ley 11

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

如果您正在寻找像解决方案这样的导出文件,您可能需要查看--retain-symbols-file=FILENAME可能正在寻找的链接器选项.

我不知道从函数名称导出具有不同名称的函数的简单方法,但可能使用精灵编辑器. 编辑:我认为您可以使用链接描述文件(查看ld的手册页)在链接步骤中为符号赋值,从而为给定函数提供替代名称.请注意,我从未尝试过这个.

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

  • @Fredrik Ullner:是的,这是默认设置,但是当隐藏成为默认值时,使用`-fvisibility = hidden`则不行.然后,你必须(以某种方式)改变你想要从隐藏的外部可见的符号的可见性,你可以用`__attribute __((visibility("default")))`来做.试一试:`echo'void f(){}'| gcc -xc -c -fvisibility = hidden -o ao - && readelf -s ao`表示隐藏了`f`的可见性,不像这里:`echo'void __attribute __((visibility("default")))f( ){}'| gcc -xc -c -fvisibility = hidden -o ao`. (3认同)
  • @Fredrik Ullner:我不明白你的意思。如果您使用`-fvisibility=hidden`,则必须将您不想隐藏的那些符号的可见性重新设置为默认值,否则将看不到任何符号。 (2认同)

Dmi*_*kov 8

如何将共享库的导出函数限制为我想要的(即等效的.def文件)

也许您正在寻找GNU导出地图符号版本控制

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