_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 状态退出。

在执行使用延迟装入的程序期间,有一些条件可能会导致发生错误。 在所有情况下,都将调用当前错误处理程序。

  1. 引用的模块 (将在函数调用时装入) 不可用或无法装入。 如果系统调用失败,那么 errVal 参数可能指示错误原因。
  2. 引用了函数,但装入的模块不包含该函数的定义。 在这种情况下, errVal 参数将为 EINVAL

可能发生以下任一错误的原因:

  1. LIBPATH 环境变量可能包含一组搜索路径,这些路径导致应用程序装入错误版本的模块。
  2. 模块已更改,不再提供与构建应用程序时相同的符号集。
  3. 由于缺少可用于进程的资源, load 子例程失败。

参数

描述
err_handler 指向新错误处理程序函数的指针。 新函数应接受 3 自变量:
MODULE
所引用模块的名称。
符号
发生故障时正在调用的函数的名称。
errVal
发生故障时 errno 的值 (如果用于装入模块的系统调用失败)。 对于其他故障, errval 可以是 EINVALENOMEM

请注意,如果调用模块已损坏,那么模块或符号的值可能为 NULL。

如果 err_handler 参数为 NULL ,那么将复原缺省错误处理程序。

返回值

此函数返回指向先前用户提供的错误处理程序的指针,如果缺省错误处理程序生效,那么返回 NULL。