Doing some messing around with ELF (of both the x86 and ARM varieties).
Associating symbol names with entries in the .got section is straightforward. Find the .got section, find the relocation section .rel.plt/.rela.plt whose .sh_info contains the index of the .got, and find the symbol section .dynsym that contains the symbol names.
Everything lines up nicely between these sections, and I can accurately assign symbol names to entries in the .got.
However, I also want names for the stubs in the .plt section. A rough percentage of the time, symbols for the .plt can be inferred based on the ordering of .got symbols, and an offset from the base of the .plt section. For whatever reason, occasionally this is not the case.
Binutils objdump can accurately generate them for x86, and IDA can accurately generate them for x86 and ARM (both without -g debugging symbols). How are these generated?
In the case of IDA, I could reasonably assume there's some advanced logic going on based on interpretation of the instructions in the .plt, but I know that must not be the case for objdump.