Due to an assembler design flaw (IMO), .symver foo,foo@v1 produces two symbols`foo` and foo@v1 if foo is defined.
- v1 {}; produces both foo and foo@v1 but GNU ld only produces foo@v1
- v1 { foo; }; produces both foo@@v1 and foo@v1 but GNU ld only produces foo@v1
- v2 { foo; }; produces both foo@@v2 and foo@v1, matching GNU ld. (Tested by symver.s)
This patch implements the GNU ld behavior by reusing the symbol redirection mechanism
in D92259. The new test symver-non-default.s checks the first two cases.
Without the patch, the second case will produce foo@v1 and foo@@v1 which
looks weird and makes foo unnecessarily default versioned.
Note: .symver foo,foo@v1,remove exists but the unfortunate foo will not go
away anytime soon.
I think this comment is now incomplete. Perhaps worth changing to something like:
For version symbol foo@v1 check the existing symbol foo.
We have two special cases to handle: