clang and gcc both seem to emit relocations in reverse order of
address. That means we can match relocations to their containing
subsections in O(relocs + subsections) rather than the `O(relocs *
log(subsections))` that our previous binary search implementation
required.
Unfortunately, ld -r can still emit unsorted relocations, so we have a
fallback code path for that (less common) case.
Numbers for linking chromium_framework on my 3.2 GHz 16-Core Intel Xeon W:
N Min Max Median Avg Stddev x 20 4.04 4.11 4.075 4.0775 0.018027756 + 20 3.95 4.02 3.98 3.985 0.020900768 Difference at 95.0% confidence -0.0925 +/- 0.0124919 -2.26855% +/- 0.306361% (Student's t, pooled s = 0.0195172)