it's clear there's a documentation problem [with DT_GNU_HASH]
Partly due to lack of documentation, already I have seen "abuses"
of the DT_GNU_HASH format. In particular, some versions of Rust
and/or musl run-times use (0 == nbucket) to mean something like
"there is no hash table information" but do not specify all the
implications for the run-time symbol table. Other versions use
(1 == nbucket && 0 == buckets[0] && 1 == n_bitmask && 0 ==
bitmask[0])
for a similar purpose. Similarly, Rust and Android can trim
"unused" zero entries from the end of &hash_array[nbucket],
even though buckets[] and hash_array[] should be parallel.