[llvm-dev] RFC: LLD: creating linker-generated sections as input sections instead of output sections

Rui Ueyama via llvm-dev llvm-dev at lists.llvm.org
Tue Oct 18 14:27:45 PDT 2016


This idea popped up in the review thread for https://reviews.llvm.org/D25627
.

Problem:

Currently, LLD creates special sections that are not just concatenations of
input sections but need link-time data generation, such as .got, .plt,
interp, .mips.options, etc., as output sections. We have OutputSectionBase
subclasses (e.g. GotSection, PltSection, etc.) to create data. Even though
this scheme works in most cases, there are a few situations that doesn't
work well as you may have noticed. Here are a issues.

 - You cannot mix special sections with other types of sections.

  For example, using linker scripts, you can instruct the linker put
mergeable sections and non-mergeable sections into the same output section.
Such script makes sense. However, LLD cannot handle such script because
string merging is the special mergeable output section's feature. The
output section doesn't know how to handle other types of sections, so you
cannot feed non-mergeable sections to a mergeable output section.

 - It cannot handle linker scripts like this as pointed by Eugene.

  .got { *(.got.plt) *(.got) }

   In our current architecture, .got section is an output section, so it
cannot be added to other output section. There's no clean way to handle
this linker script.

Proposal:

Here's my idea: how about creating all special sections as input sections
instead of output sections?

GotSection, PltSection, etc. will be subclasses of InputSection that don't
have corresponding input files. What they will do remain the same. They
will be added to OutputSections just like other regular sections are added.
I think we could simplify OutputSection a lot -- OutputSection will
probably become a dumb container that just concatenates all input sections.

This approach would solve the problems described above. Now that we create
.got as an special input section with ".got" as a name, so they can
naturally be added to any output section. String merging occurs inside a
special mergeable input section, so they can be added to any section, too.

So, I think by moving the implementations from OutputSection to
InputSection, we can solve many problems. I do not think of any obvious
problem with the approach.

What do you think?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161018/da41a772/attachment.html>


More information about the llvm-dev mailing list