【问题标题】:What functions does a C library export?C 库导出哪些函数?
【发布时间】:2014-08-02 16:47:08
【问题描述】:

如果我在 Windows、Linux 或 Mac 中使用 C 或 C++ 库,是否有任何方法可以知道它导出的函数和数据结构及其签名,而无需此库的文档?

【问题讨论】:

  • “出口”是什么意思?链接器可见的符号或标头中声明的标识符?
  • 那种取决于。如果你有它的标题(例如),它将告诉你函数和结构(但不一定是关于如何使用它们)。如果您只有正确的库(.lib、.a、.so 等),那么您通常可以获得相当多的 C++ 信息(基于名称修饰),但对于 C 来说则更少(因为它通常不会使用名称修饰)。
  • 考虑到链接器可以检查它,答案在逻辑上必须是“是”(尽管不一定是有关数据结构的完整信息)。这是微不足道的逻辑。您是在询问具体的方法吗?在这种情况下,请提供各种库和特定工具链的详细信息。
  • 有一些工具可以检查 .dll 导出的内容,是的。例如,您可能需要检查Dependency Walker tool。
  • @Jongware:这个问题似乎也包括静态库。

标签: c++ c dll shared-libraries


【解决方案1】:

您绝对可以列出链接器使用的符号名称。对于 C++,这是一个完整的(损坏的)签名。对于 C(也适用于 C++ 中的 extern "C"),它通常只是简单的名称(有时是参数的总大小,但没有类型、每个大小,甚至是参数的数量)。

在 Unix 系统上,您需要的工具是 nm(或 objdump,它还可以显示没有链接的符号)。在 Windows 上,DUMPBIN /EXPORTS。

如果尝试检查静态库,您可能必须先提取它们(在 Unix 上为 ar,在 Windows 上为 lib.exe),然后在各个成员(目标文件)上调用 nm 或 dumpbin。

有关获取 C++ 签名的详细信息,请参阅此相关问题:Finding arguments that go with methods in C++ dll's

调试信息也可以提供对 C 链接签名的访问,因为它们不存储在符号表中。

【讨论】:

  • OS X 命令(最有可能用于 OP 所谓的“Mac”)也是 nm。
  • @Jongware:OS X 和 Linux 都是 Unixy 系统(OS X 是 BSD)。
  • OP 似乎没有意识到这一点。
  • @Jongware:Apple II 不是 Macintosh。然而,在采用 BSD 和 OS X 之前,有 System 7、Mac OS 8、Mac OS 9。(我认为这些都是基于 NeXt 的?)
  • 是的,很抱歉 - 意识到为时已晚。不过,OP 应该写“OS X”而不是“Mac”。我有点像“我家里有一台 IBM”,意思是一台兼容 Windows 的 PC。 (即使“PC”这个词在政治上也不再正确。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多