Add support for DT_RELR/SHT_RELR compressed relocation sections (#395)
authorAndreas Ziegler <andreas.ziegler@fau.de>
Mon, 14 Feb 2022 13:44:27 +0000 (14:44 +0100)
committerGitHub <noreply@github.com>
Mon, 14 Feb 2022 13:44:27 +0000 (05:44 -0800)
commitc2cfef0557a7297dc945fc29ff4f5d44ca6b1f51
tree1f570def28952be599b3341558969ef01a215155
parent7d69c1a1eac57dee6649ec1ae7b53a6682dfaa29
Add support for DT_RELR/SHT_RELR compressed relocation sections (#395)

As more and more tools now support DT_RELR compressed relocations
(most notably, the just released GNU binutils 2.38 [0]), let's add
support for reading these relocations as well.

The original discussion about advantages of packe RELATIVE
relocations can be found at [1]. In a nutshell, the format
exploits the fact that RELATIVE relocations are often placed
next to each other and (for x86_64) stores up to 64 relocations
in two 8-byte words. In a regular .rela.dyn table, these would
take up 24 * 64 = 1536 bytes.

The compressed relocations work as follows:

The first word in the section describes a base address and
contains an offset for a relocation. This offset must always
lie at an even address. Following this entry can be one or
more bitmap(s) which have their least significant bit set to 1.
All other bits describe (in increasing order of significance) if
the following continuous offsets also contain a relocation. The
addends for existing relocations are stored at the corresponding
offsets in the file (that is, they work like REL relocations).
A good description of the history of this feature and its current
adoption is the following blog post [2].

[0]: https://lists.gnu.org/archive/html/info-gnu/2022-02/msg00009.html
[1]: https://groups.google.com/g/generic-abi/c/bX460iggiKg?pli=1
[2]: https://maskray.me/blog/2021-10-31-relative-relocations-and-relr
elftools/elf/descriptions.py
elftools/elf/elffile.py
elftools/elf/enums.py
elftools/elf/relocation.py
elftools/elf/structs.py
test/test_relr.py [new file with mode: 0644]
test/testfiles_for_unittests/lib_relro.so.elf [new file with mode: 0755]