dlopen() 函数是否设置 errno?

4

标题已经说明了一切。手册中没有提到任何信息。有些人在dlopen之后检查errno,但只有几个人并且结果不同。该函数确实返回一个成功/失败的值,但是应该如何确定失败的原因呢?

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


2
“man dlopen” 明确告诉我们关于 “dlerror” 的信息。 - Eugene Sh.
2
设置 errno 与影响 errno 是不同的。调用 dlopen() 可能会改变 errno 的值。例如,当 dlopen() 尝试定位库时,open() 调用可能会失败。 - Andrew Henle
我投票关闭此问题,因为提问者懒得阅读dlopen的手册页。 - KevinDTimm
1个回答

9

No (强调已添加)。

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


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


好的,我漏掉了关于dlerror的部分,我之前不知道。还有感谢Andrew的评论,这解释了为什么当errno改变时我觉得自己在正确的轨道上。 - user1159290
个人而言,我喜欢遵循POSIX标准,这意味着我要查看Open Group网站而不是仅仅使用本地的man手册。虽然大多数man手册都遵循一定的模式,但它们并没有标准化,所以错误信息可能在自己的部分,也可能在“返回值”部分。 - Max Lybbert
1
这个答案忽略了一个事实,即虽然dlopen不会设置(分配有意义的值)给errno,但它允许使用除零以外的任何值来clobber errno(就像所有未明确禁止这样做的其他函数一样)。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接