<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Oct 29, 2013, at 9:52 PM, Shankar Easwaran wrote:</div><blockquote type="cite"><div text="#000000" bgcolor="#FFFFFF">I am trying to implement support for handling section groups in lld.<br>
    <br>
    There are two ways of figuring out section groups with ELF.<br>
    <br>
    a) Sections with SHF_GROUP property<br>
    b) .gnu.linkonce sections (the signature identified by the name of
    the section) -- This was the method to coalesce similiar constants.<br>
    <br>
    Section Groups(SHF_GROUP) is the preferred way on ELF but
    .gnu.linkonce sections is also used.<br>
    <br>
    We would need to support both occurences in ELF files with lld.<br>
    <br>
    <u><b>Problem</b></u><br>
    <br>
    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.<br>
    <br>
    <u><b>Example</b></u><br>
    <br>
    For simplicity I am considering two section groups A and B (that
    have the same signature). <br>
    <br>
    Say A contains atoms A1, A2, A3, and the section group B contains
    atoms A1", A2", A3"<br>
    <br>
    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. <br>
    <br>
    <u><b>Problem</b></u><br>
    Its easier to only set the _replaceAtoms[A] = B and the Resolver
    could just remove B in this case.<br>
    <br>
    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.<br>
    <br>
    <u><b>Solution</b></u><br>
    A way to accomplish this could be to <br>
    <br>
    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.<br>
    <br>
    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.<br>
    <br>
    I am ok with either of the methods (A) or (B) but inclined towards
    (B).</div></blockquote>I was thinking both A & B.  That is how I do it with the darwin linker.  When a group is parsed, the signature atom has a "group" reference for all the other atoms in the group.  When the Resolver replaces one atom with another, it looks to see if the atom has any group references, and if so, marks all those atoms as coalesced away.  </div><div><br></div><div>-Nick</div><div><br></div><div><br></div></body></html>