HomePhabricator

[ELF] Combine foo@v1 and foo with the same versionId if both are defined

Authored by MaskRay on Aug 4 2021, 9:06 AM.

Description

[ELF] Combine foo@v1 and foo with the same versionId if both are defined

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.

Reviewed By: peter.smith

Differential Revision: https://reviews.llvm.org/D107235

Details