SPRUIG8J January 2018 – March 2024
An entry hook is a routine that is called upon entry to each function in the program. An exit hook is a routine that is called upon exit of each function. Applications for hooks include debugging, trace, profiling, and stack overflow checking. Entry and exit hooks are enabled using the following options:
--entry_hook[=name] | Enables entry hooks. If specified, the hook function is called name. Otherwise, the default entry hook function name is __entry_hook. |
--entry_parm{=name| address|none} |
Specify the parameters to the hook function. The name parameter
specifies that the name of the calling function is passed to the hook function as an
argument. In this case the signature for the hook function is: void hook(const char
*name); The address parameter specifies that the address of the calling function is passed to the hook function. In this case the signature for the hook function is: void hook(void (*addr)()); The none parameter specifies that the hook is called with no parameters. This is the default. In this case the signature for the hook function is: void hook(void); |
--exit_hook[=name] | Enables exit hooks. If specified, the hook function is called name. Otherwise, the default exit hook function name is __exit_hook. |
--exit_parm{=name| address|none} |
Specify the parameters to the hook function. The name parameter
specifies that the name of the calling function is passed to the hook function as an
argument. In this case the signature for the hook function is: void hook(const char
*name); The address parameter specifies that the address of the calling function is passed to the hook function. In this case the signature for the hook function is: void hook(void (*addr)()); The none parameter specifies that the hook is called with no parameters. This is the default. In this case the signature for the hook function is: void hook(void); |
The presence of the hook options creates an implicit declaration of the hook function with the given signature. If a declaration or definition of the hook function appears in the compilation unit compiled with the options, it must agree with the signatures listed above.
In C++, the hooks are declared extern "C". Thus you can define them in C without being concerned with name mangling.
Hooks can be declared inline, in which case the compiler tries to inline them using the same criteria as other inline functions.
Entry hooks and exit hooks are independent. You can enable one but not the other, or both. The same function can be used as both the entry and exit hook.
You must take care to avoid recursive calls to hook functions. The hook function should not call any function which itself has hook calls inserted. To help prevent this, hooks are not generated for inline functions, or for the hook functions themselves.
You can use the --remove_hooks_when_inlining option to remove entry/exit hooks for functions that are auto-inlined by the optimizer.
See Section 5.8.27 for information about the NO_HOOKS pragma.