Linking FreeBSD with lld: -dc option missing

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 16 09:09:12 PST 2016


On Wed, Nov 16, 2016 at 9:05 AM, Rafael EspĂ­ndola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> On 16 November 2016 at 11:57, Ed Maste via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > I'm now looking in more detail at the final two issues preventing us
> > from fully using lld for building FreeBSD userland and kernel. The
> > issues have been discussed in sub-threads in the past, but as we're
> > very close to building FreeBSD with lld "out of the box" I'm focusing
> > on final resolutions for them. I need to either have lld gain the last
> > pieces of missing functionality, or commit to a permanent change in
> > FreeBSD.
>
> Thanks!
>
> >  * crunchide.c - tiptoes through a symbol table, hiding all defined
> >  *      global symbols.  Allows the user to supply a "keep list" of
> symbols
> >  *      that are not to be hidden.  This program relies on the use of the
> >  *      linker's -dc flag to actually put global bss data into the file's
> >  *      bss segment (rather than leaving it as undefined "common" data).
> >  *
> >  *      The point of all this is to allow multiple programs to be linked
> >  *      together without getting multiple-defined errors.
> >  *
> >  *      For example, consider a program "foo.c".  It can be linked with a
> >  *      small stub routine, called "foostub.c", eg:
> >  *          int foo_main(int argc, char **argv){ return main(argc,
> argv); }
> >  *      like so:
> >  *          cc -c foo.c foostub.c
> >  *          ld -dc -r foo.o foostub.o -o foo.combined.o
> >  *          crunchide -k _foo_main foo.combined.o
> >  *      at this point, foo.combined.o can be linked with another program
> >  *      and invoked with "foo_main(argc, argv)".  foo's main() and any
> >  *      other globals are hidden and will not conflict with other
> symbols.
>
> And it doesn't know how to hide common symbols, so it depends on they
> being pre allocated to .bss.
>
> > In order to make this work with lld I need to do one of three things:
> >
> > 1) compile the object files with -fno-common
> > 2) give crunchide some simple linking ability, so that it can convert
> > common symbols into allocated .bss symbols
> > 3) add -dc support to lld
> >
> > Rafael previously suggested #1. It's feasible, but makes the crunch
> > build system slightly less portable (in that it couldn't be used with
> > other software that relies on common symbol behaviour). It also
> > requires that we build a second set of objects for the rescue build,
> > if -fno-common isn't applied to the "normal" build of the tools.
>
> So, right now if a foo.o is in both /bin/sh and the rescue system you
> only compile it once? I would assume that the one in the rescue system
> was a special minimal version. If the size is not an issue, why do you
> "concatenate" multiple program into one? Why not just have static
> versions of sh, ls, etc?
>
> > Rafael/Rui, do you think it's reasonable to add -dc to lld?
>
> Now that we use synthetic input sections it should not be too
> horrible. I would just like to understand what is the need a bit
> better.
>

Yes, I guess that it shouldn't be hard to add this feature to LLD now, and
I also guess that the change would be a local one (you wouldn't change many
places in the linker.)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161116/fc1d6b8f/attachment.html>


More information about the llvm-commits mailing list