【问题标题】:Does dlopen() set errno?dlopen() 是否设置 errno?
【发布时间】:2016-10-20 14:59:27
【问题描述】:

一切都在标题中。手册页什么也没说。一些谷歌报告有人在 dlopen 后检查 errno,但结果很少,而且结果各不相同。该函数确实返回一个成功/不成功的值,但是应该如何找出失败的原因。

dlopen() 是否设置了 errno?那么,不同的 errno 值在哪里定义呢? 如果不是,应该使用什么检查导致失败的原因?

【问题讨论】:

  • man dlopen 清楚地告诉我们dlerror...
  • 设置 errno 不同于影响 errno。调用dlopen() 很有可能更改 errno 的值。例如,open() 调用可能会失败,因为 dlopen() 尝试查找库。
  • 我投票决定将此问题作为离题结束,因为 OP 懒得阅读 dlopen 的手册页

标签: c linux dlopen


【解决方案1】:

No(已添加重点)。

成功完成后,dlopen() 将返回一个符号表句柄。如果 file 找不到、无法打开读取、不是 dlopen() 处理的合适的可执行目标文件格式,或者在处理过程中发生错误在加载文件或重新定位其符号引用时,dlopen() 应返回一个空指针。 可通过dlerror()获取更详细的诊断信息


正如其他人所指出的,没有什么可以禁止 dlopen()(或者更有可能是 dlopen() 调用的函数)修改 errno。但是符合标准的dlopen() 不会通过errno 报告自己的错误。您需要致电dlerror()

【讨论】:

  • 好的,错过了我不知道的关于 dlerror 的 man 部分。并感谢 Andrew 的评论,这肯定解释了为什么当 errno 更改时我觉得自己在轨道上......
  • 就我个人而言,我喜欢使用 POSIX,这对我来说意味着检查 Open Group 的网站,而不是简单地使用本地联机帮助页。确实,虽然大多数联机帮助页都遵循某种模式,但它们并未标准化,因此错误信息可能位于其自己的部分中,也可能位于“返回值”部分中。
  • 这个答案遗漏了这样一个事实,虽然dlopen 没有设置(分配一个有意义的值)给errno,但允许clobber i> errno 具有除零以外的任何值(就像所有其他未明确禁止这样做的函数都允许这样做)。
猜你喜欢
  • 2014-05-01
  • 2012-05-27
  • 2021-01-06
  • 2021-05-18
  • 1970-01-01
  • 2013-08-23
  • 2020-11-28
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多