[PATCH] MIPS support for --hash-style=gnu
Huang Pei
huangpei@loongson.cn
Wed Jan 6 02:34:00 GMT 2016
Hi, everybody,
On N64, the layout of .gnu.xhash cause unaligned access at bitmask
field, so I suggest we remove ngnusyms at the header of the .gnu.xhash
to avoid the unaligned access. Since MIPS ELF requires DT_MIPS_SYMTABNO
Tag is present with
dynsymcount, so I think ngnusyms can be taken by dynsymcount - symndx
// Part 0: .gnu.hash header
Elf32_Word nbuckets; // number of hash table buckets
Elf32_Word symndx; // number of initial .dynsym entires skipped
in chains[] (and xlat[])
Elf32_Word maskwords; // number of ElfW(Addr) words in bitmask
Elf32_Word shift2; // bit shift of hashval for second Bloom
filter bit
// Part 1: .gnu.hash Bloom filter
ElfW(Addr) bitmask[maskwords]; // 2 bit Bloom filter on hashval
// Part 2: .gnu.hash buckets
Elf32_Word buckets[nbuckets]; // indices into chains[]
// Part 3: .gnu.hash chains
Elf32_Word chains[ngnusyms]; // consecutive hashvals in a given
bucket; last entry in chain has LSB set
// Part 4: .gnu.xhash translation table
Elf32_Word xlat[ngnusyms]; // parallel to chains[]; index into
.dynsym
below is the patch removing ngnusyms
https://github.com/heiher/binutils-mips/commit/ceefe8ac5f52285d2c98a43a66c2d7d31574b3f4
https://github.com/heiher/glibc-mips/commit/db33de9af675f9851c0941ca186baf87c79d8ab9
any suggestion?
........
In practice, though, the .gnu.xhash section is virtually identical to
.gnu.hash. [9]
// Part 0: .gnu.xhash header
Elf32_Word ngnusyms; // number of entries in chains (and xlat);
dynsymcount=symndx+ngnusyms
// Part 1: .gnu.hash header
Elf32_Word nbuckets; // number of hash table buckets
Elf32_Word symndx; // number of initial .dynsym entires skipped
in chains[] (and xlat[])
Elf32_Word maskwords; // number of ElfW(Addr) words in bitmask
Elf32_Word shift2; // bit shift of hashval for second Bloom
filter bit
// Part 2: .gnu.hash Bloom filter
ElfW(Addr) bitmask[maskwords]; // 2 bit Bloom filter on hashval
// Part 3: .gnu.hash buckets
Elf32_Word buckets[nbuckets]; // indices into chains[]
// Part 4: .gnu.hash chains
Elf32_Word chains[ngnusyms]; // consecutive hashvals in a given
bucket; last entry in chain has LSB set
// Part 5: .gnu.xhash translation table
Elf32_Word xlat[ngnusyms]; // parallel to chains[]; index into
.dynsym
..........
More information about the Binutils
mailing list