【发布时间】:2012-03-27 18:22:28
【问题描述】:
对于 VC,我可以编写一个 DEF 文件并使用“NONAME”指令在 dll 的导出表中只保留序号。
如何使用 gcc 和 ELF 格式的共享库做同样的事情?
或者,ELF 共享库中是否有类似 PE 格式 DLL 中的序号的东西?如果没有,我如何在共享库中隐藏导出符号的名称?
========================================
更新:一些附加说明:
在 Windows 中,您可以通过仅放置一个具有空名称的整数 ID(序数)来导出函数。
为了显示它,dll 导出表的正常布局如下所示:http://home.hiwaay.net/~georgech/WhitePapers/Exporting/HowTo22.gif。
“NONAME”看起来像这样:http://home.hiwaay.net/~georgech/WhitePapers/Exporting/HowTo23.gif。
请注意,第二张图片中的函数名称为“N/A”。这是一个完整的解释:hxxp://home.hiwaay.net/~georgech/WhitePapers/Exporting/Exp.htm。
========================================
更新:非常感谢所有给我建议的人。最后,我决定在 linux/posix 平台上继续使用静态库。 但是将小的“特殊部分”(它使用一些不适合静态库的功能,例如:TLS Slot 等)提取到普通的共享库。因为小型普通共享库只做很少的事情,而这些工作完全不敏感,所以没有必要隐藏/隐藏它的 API。
我认为这是解决我的问题的最简单方法:-D
【问题讨论】:
-
如果我从 .so 文件中删除了一个动态符号,我可以使用序数之类的东西从另一个应用程序中再次调用它吗?
-
关键是大多数 Linux 人不知道
NONAME指令在 Windows 世界中的含义(至少我不知道,因为我从未使用过或为 Windows 编写过代码)。所以你应该解释这意味着什么(以及什么是“PE中的序数”)。更一般地,解释你真正想要实现的目标,而不是参考 Windows 是如何做到的。 -
您在各种答案中的 cmets 包含比问题更详细的信息。您应该考虑编辑您的问题以包含此信息。
-
好的,你说得对,Basile,我会附加一些额外的解释。但简而言之:我需要导出一个函数但隐藏它的名称。
-
但是,在 Linux 世界中,导出函数并隐藏其名称本身就是矛盾的。您将有一个用于库的头文件,并且该头文件提到通过 names 导出的函数(否则,该函数不会被导出,即使通过一些肮脏的技巧可以使其可访问)。
标签: c++ c gcc shared-libraries