I am trying to implement support for handling section groups in lld.
There are two ways of figuring out section groups with ELF.
a) Sections with SHF_GROUP property
b) .gnu.linkonce sections (the signature identified by the name of the section) – This was the method to coalesce similiar constants.
Section Groups(SHF_GROUP) is the preferred way on ELF but .gnu.linkonce sections is also used.
We would need to support both occurences in ELF files with lld.
Currently the SymbolTable assumes that an atom is going to be replaced by one another atom, but in the case of a section group, a whole group can be coalesced depending on whether the group with the same signature was previously seen.
For simplicity I am considering two section groups A and B (that have the same signature).
Say A contains atoms A1, A2, A3, and the section group B contains atoms A1", A2", A3"
To complicate things, groups A can contain fewer atoms than group B(currently supported on ELF!) – This happens in environments where the user tried to compile object files and forgot to compile the rest of the object files.
Its easier to only set the _replaceAtoms[A] = B and the Resolver could just remove B in this case.
Inorder to remove all the atoms in Group B, B and all its layout-after references need to be iterated. The problem is still the _replacedAtoms map that needs to be set before all the atoms in B can be coalesced.
A way to accomplish this could be to
A) Use the in-group reference along with the layout-after reference. The in-group reference for atoms in the group B are going to contain B as the root of the group.
B) Another way is that we could have a Atom attribute coalescedAway() which would be set for all atoms that we want to remove. This would also need in-group references.
I am ok with either of the methods (A) or (B) but inclined towards (B).
– Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation