LLD handling of orphaned sections

Hello,

The handling of orphaned sections in LLD 8 has changed from GNU LD
behavior (note that LLD 7 didn't show this behavior). I've reported
this as:

https://bugs.llvm.org/show_bug.cgi?id=42327

It's not clear to me however whether this is intentional or a
regression when compared to LLD 7.

As stated in that bug report it would be helpful for me to get some
kind of documentation that describes LLD intended handling of orphaned
sections, so that I can justify fixes in order to support LLD, and
that I can be sure what I modify is going to be robust against future
changes in LLD. For example GNU LD has:

https://sourceware.org/binutils/docs/ld/Orphan-Sections.html

Having something like this for LLD (if it's going to diverge from GNU
LD behavior) would be very helpful, and would allow me to implement
future proof support for LLD in Xen.

Thanks, Roger.

I think Geroge (cc’ed) knows better than me in that area.

lld is underdocumented, and in particular there is virtually no documentation about its linker script support. Our basic strategy is to follow the GNU’s documentation and the implementations unless it is too hard or doesn’t match with the rest of lld. So, as long as it works just like GNU, it’s fine, but if not, it is hard to say whether it is intended or not, just as you explained. This is an area that we need to improve.

I think Geroge (cc'ed) knows better than me in that area.

lld is underdocumented, and in particular there is virtually no documentation about its linker script support. Our basic strategy is to follow the GNU's documentation and the implementations unless it is too hard or doesn't match with the rest of lld. So, as long as it works just like GNU, it's fine, but if not, it is hard to say whether it is intended or not, just as you explained. This is an area that we need to improve.

I think it would be helpful if we could come up with some user-level
documentation on the intentional differences between LLD and GNU ld,
particularly in the less well specified areas like orphan section
assignment and program header generation. I think we'd have to be very
careful with what we wrote down though, to a first approximation we
have differences that are intentional or non-intentional; and on a
separate axis differences that are stable or subject to change. We'd
want to concentrate on documenting differences that are intentional
and stable, such as back references being allowed in library
selection.

If there is interest in working this out I'm willing to start a list
of the differences, whether it is in the document or just a text file
alongside the source. It is something that could be built up
incrementally and over time we can identify the stable differences?

Peter

I think it would be helpful if we could come up with some user-level
documentation on the intentional differences between LLD and GNU ld,
particularly in the less well specified areas like orphan section
assignment

I agree. As we all know even GNU ld and GNU gold can
layout the sections differently. And when a question like "what is the differences
between LLD and GNU ld in this part" arise, I afraid I do not have a good answer.
We have a more or less clear documented general heuristics that usually work,
but also had to implement/fix too many corner cases probably.

Having a documentation about this would be great I think.

(My general suggestion for people is usually: try to avoid having orphans if you can.
I know that is not always can be a solution though.)

Best regards,
George | Developer | Access Softek, Inc

I think Geroge (cc'ed) knows better than me in that area.

Thanks for the reply.

lld is underdocumented, and in particular there is virtually no
documentation about its linker script support. Our basic strategy is to
follow the GNU's documentation and the implementations unless it is too
hard or doesn't match with the rest of lld.

Here LLD is diverging from GNU ld, and TBH I think this is going to
cause issues to other projects that also use linker scripts.

One of the reasons of using linker scripts is to have fine grained
control about section placement. Without a formal statement about LLD
behaviour regarding orphaned section handling in linker scripts the
only option to have fine grained control is to use
--orphan-handling=error and thus to be sure every input section is
handled, which is likely to be hard to justify as a change in order to
support LLD.

So, as long as it works just
like GNU, it's fine, but if not, it is hard to say whether it is intended
or not, just as you explained. This is an area that we need to improve.

As I understand it when there's no linker script LLD has a lot more
freedom to layout sections differently from GNU ld, but I think doing
it for the linker script case is likely to cause trouble in the long
run for projects trying to switch to LLD or trying to support both GNU
ld and LLD (like Xen).

Roger.

> I think it would be helpful if we could come up with some user-level
> documentation on the intentional differences between LLD and GNU ld,
> particularly in the less well specified areas like orphan section
> assignment

I agree. As we all know even GNU ld and GNU gold can
layout the sections differently. And when a question like "what is the differences
between LLD and GNU ld in this part" arise, I afraid I do not have a good answer.
We have a more or less clear documented general heuristics that usually work,
but also had to implement/fix too many corner cases probably.

Having a documentation about this would be great I think.

I think this would be a good start, IMO it's important to have
diverging GNU ld behaviour documented, or else it's painful to add LLD
support to projects using GNU ld.

After all it's still not clear to me whether the current orphan
section handling in LLD 8 is intentional or a regression when compared
to LLD 7.

(My general suggestion for people is usually: try to avoid having orphans if you can.
I know that is not always can be a solution though.)

That would indeed be an option, but I'm afraid it's going to be hard
to justify switching to --orphan-handling=error in order to add
support to LLD.

Also I'm worried that different compiler versions could generate
diverging section names, thus forcing us to expand the linker script
with tons of sections, and having to modify it in order to support
newer versions.

Thanks, Roger.