This fixes PR38549, which is silently accepted by ld.bfd.
This seems correct because it makes sense to let non-glob patterns take
precedence over glob patterns.
lld issues an error because
assignWildcardVersion(ver, VER_NDX_LOCAL); is processed before assignExactVersion(ver, v.id, v.name);.
Move all assignWildcardVersion() calls after assignExactVersion() calls
to fix this.
Also, move handleDynamicList() to the bottom. computeBinding() called by
includeInDynsym() has this cryptic rule:
if (versionId == VER_NDX_LOCAL && isDefined() && !isPreemptible) return STB_LOCAL;
Before the change:
- foo's version is set to VER_NDX_LOCAL due to local: *
- handleDynamicList() is called
- foo.computeBinding() is STB_LOCAL
- foo.includeInDynsym() is false
- foo.isPreemptible is not set (wrong)
- foo's version is set to V1
After the change:
- foo's version is set to VER_NDX_LOCAL due to local: *
- foo's version is set to V1
- handleDynamicList() is called
- foo.computeBinding() is STB_GLOBAL
- foo.includeInDynsym() is true
- foo.isPreemptible is set (correct)