diff options
| author | Job Noorman <jnoorman@igalia.com> | 2023-11-08 11:01:10 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-08 11:01:10 +0000 |
| commit | 96b5e092dcd624b494d769e47341e50b1028972e (patch) | |
| tree | b6f215867ac6a39343224d52b095227fb234b80e /lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py | |
| parent | 8d72079077f8b8bf4a8d7173edbb09be083d975b (diff) | |
[BOLT] Support instrumentation hook via DT_FINI_ARRAY (#67348)
BOLT currently hooks its its instrumentation finalization function via
`DT_FINI`. However, this method of calling finalization routines is not
supported anymore on newer ABIs like RISC-V. `DT_FINI_ARRAY` is
preferred there.
This patch adds support for hooking into `DT_FINI_ARRAY` instead if the
binary does not have a `DT_FINI` entry. If it does, `DT_FINI` takes
precedence so this patch should not change how the currently supported
instrumentation targets behave.
`DT_FINI_ARRAY` points to an array in memory of `DT_FINI_ARRAYSZ` bytes.
It consists of pointer-length entries that contain the addresses of
finalization functions. However, the addresses are only filled-in by the
dynamic linker at load time using relative relocations. This makes
hooking via `DT_FINI_ARRAY` a bit more complicated than via `DT_FINI`.
The implementation works as follows:
- While scanning the binary: find the section where `DT_FINI_ARRAY`
points to, read its first dynamic relocation and use its addend to find
the address of the fini function we will use to hook;
- While writing the output file: overwrite the addend of the dynamic
relocation with the address of the runtime library's fini function.
Updating the dynamic relocation required a bit of boiler plate: since
dynamic relocations are stored in a `std::multiset` which doesn't
support getting mutable references to its items, functions were added to
`BinarySection` to take an existing relocation and insert a new one.
Diffstat (limited to 'lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py')
0 files changed, 0 insertions, 0 deletions
