_lazySetErrorHandler子程序
用途
将错误处理程序安装到当前进程的延迟装入运行时系统中。
库
标准 C 库 (libc.a)
语法
#include <sys/ldr.h>
#include <sys/errno.h> typedef void (*_handler_t(
char *_module,
char *_symbol,
unsigned int _errVal ))(); handler_t *_lazySetErrorHandler(err_handler)
handler_t *err_handler;描述
此函数允许进程安装定制错误处理程序,以在延迟装入引用找不到所需模块或函数时调用该错误处理程序。 仅当使用 -blazy 选项链接主程序或其某个从属模块时,才应使用此函数。 要从一个未与 "-炽热选项链接的模块中调用 "_lazySetErrorHandler,必须使用 "-lrtl选项。 如果使用 -blazy,那么不需要指定 -lrtl。
此函数不是线程安全的。 调用程序应确保_lazySetErrorHandler不会同时被多个线程调用。
用户提供的错误处理程序可以打印它自己的错误消息,提供替代函数来代替被调用的函数,或者调用 longjmp 子例程。 要提供将被调用而不是最初引用的函数的替代函数,错误处理程序应返回指向替代函数的指针。 此替代函数将由来自同一模块的对预期函数的所有后续调用调用。 如果错误处理程序返回的值似乎无效 (例如, NULL 指针) ,那么将使用缺省错误处理程序。
每个调用模块都独立于其他模块来解析其惰性引用。 也就是说,如果模块 A 和 B 都调用了模块 C 中的 foo 子例程,但模块 C 不导出 foo 子例程,那么当首次从 A 调用 foo 子例程时,将调用错误处理程序一次。 以及第一次从 B 调用 foo 子例程时的一次。
缺省延迟装入错误处理程序将打印一条消息,其中包含: 程序需要的模块的名称; 正在访问的符号的名称; 以及由故障生成的错误值。 由于缺省处理程序将延迟装入错误视为致命错误,因此进程将以 1 状态退出。
在执行使用延迟装入的程序期间,有一些条件可能会导致发生错误。 在所有情况下,都将调用当前错误处理程序。
- 引用的模块 (将在函数调用时装入) 不可用或无法装入。 如果系统调用失败,那么 errVal 参数可能指示错误原因。
- 引用了函数,但装入的模块不包含该函数的定义。 在这种情况下, errVal 参数将为 EINVAL。
可能发生以下任一错误的原因:
- LIBPATH 环境变量可能包含一组搜索路径,这些路径导致应用程序装入错误版本的模块。
- 模块已更改,不再提供与构建应用程序时相同的符号集。
- 由于缺少可用于进程的资源, load 子例程失败。
参数
| 项 | 描述 |
|---|---|
| err_handler | 指向新错误处理程序函数的指针。 新函数应接受 3 自变量:
|
请注意,如果调用模块已损坏,那么模块或符号的值可能为 NULL。
如果 err_handler 参数为 NULL ,那么将复原缺省错误处理程序。
返回值
此函数返回指向先前用户提供的错误处理程序的指针,如果缺省错误处理程序生效,那么返回 NULL。