The main problem is in the predicate passed to the std::stable_sort(). This predicate always returns false if both section's names do not start with .init_array or .fini_array prefixes. In short, it does not define a strict weak ordering. Suppose we have the following sections:
.A .init_array.1 .init_array.2
The predicate states that:
not .init_array.1 < .A not .A < .init_array.2 but .init_array.1 < .init_array.2 !!!
The second problem is that .init_array section without number should go last in the list. Not it has the lowest priority '0' and goes first.
The patch fix both of the problems.