Use stable sort for ld -r relocs

Jiong Wang jiong.wang@arm.com
Tue Sep 15 13:16:00 GMT 2015


Alan Modra writes:

> A number of targets emit multiple relocs at a given r_offset, and
> depend on those relocs staying in their original order.  qsort doesn't
> satisfy this requirement, although it appears from my non-rigorous
> testing that glibc's msort.c implementation may in fact be stable.
>
> I made the mistake of backporting my PR 17666 fix to 2.25.1, thinking
> the code had enough time to settle on mainline, but for anyone with a
> system libc that provides an unstable qsort this will mean 2.25.1
> ld -r may be broken on some targets.
>
> 	PR 18867
> 	* elflink.c (cmp_ext32l_r_offset, cmp_ext32b_r_offset): Delete.
> 	(cmp_ext64l_r_offset, cmp_ext64b_r_offset): Delete.
> 	(ext32l_r_offset, ext32b_r_offset, ext64l_r_offset, ext64b_r_offset):
> 	New functions.
> 	(elf_link_adjust_relocs): Use an insertion sort to sort relocs.
>

Alan,

  After this patch, the linking speed becomes much slower when linking
  AArch64 kernel on x86 cross environment.


  Link time before your patch
  ===
  real	0m1.388s
  user	0m0.893s
  sys	0m0.267s

  after your patch
  ===
  real	3m17.189s
  user	3m16.476s
  sys	0m0.308s

  Below is the simple perf result on the hot functions.

    61.46%  ld-new  libc-2.19.so       [.] __memmove_ssse3_back
    32.24%  ld-new  ld-new             [.] ext64l_r_offset
    5.51%  ld-new  ld-new              [.] elf_link_adjust_relocs

  Could you please have a look at this?
  
  Thanks.

-- 
Regards,
Jiong



More information about the Binutils mailing list