What to do when sh_addralign isn't a power of two
authorAlan Modra <amodra@gmail.com>
Tue, 15 Feb 2022 09:41:03 +0000 (20:11 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 16 Feb 2022 11:35:10 +0000 (22:05 +1030)
commit1f9b1a84350d3755ce8620900a35c3d1997535e6
treefaf43bbd8090ba94d17758ac78e56dee925253a5
parent6e731729881ae4c1a9542843c29a3981166c9e45
What to do when sh_addralign isn't a power of two

BFD generally doesn't handle anything but a power of two section
alignment, and ELF sh_addralign is required to be an integral power of
two (or zero) by the ELF spec.  Of course this is ignored by fuzzers,
and because bfd_log2 rounds up, we can end up with alignment_power
being 32 on a 32-bit object or 64 on a 64-bit object.  That then
triggers ubsan warnings in places like bfd_update_compression_header
where we want to convert from alignment_power back to an alignment.
I suppose we could reject object files that have non-compliant
sh_addralign, but I think it's also reasonable to use the greatest
power of two divisor of sh_addralign, ie. the rightmost 1 bit.

* elf.c (_bfd_elf_make_section_from_shdr): Use greatest power
of two divisor of sh_addralign.
(_bfd_elf_assign_file_position_for_section): Likewise.
(assign_file_positions_for_non_load_sections): Likewise.
bfd/elf.c