[llvm-dev] Make LLD output COFF relocatable object file (like ELF's -r does). How much work is required to implement this?
kyra via llvm-dev
llvm-dev at lists.llvm.org
Tue Oct 10 12:41:53 PDT 2017
On 10/10/2017 9:00 PM, Rui Ueyama wrote:
> I'm not sure if I understand correctly. If my understanding is
> correct, you are saying that GHC can link either .o or .so at runtime,
> which sounds a bit odd because .o is not designed for dynamic linking.
> Am I missing something?
Yes, GHC runtime linker *does* link .o files not only doing all
necessary relocations but also creating trampolines for "far" code to
fulfill "small" memory model.
> I also do not understand why only static libraries need "compile/link
> pass" -- they at least don't need a compile pass, as they contain
> compiled .o files, and they indeed need a link pass, but that's also
> true for a single big .o file generated by -r, no? After all, in order
> to link against a .a file, I think you need to pull out a .o file from
> a .a and do whatever you need to do to link a single big .o file.
Don't quite understand this.
The idea is that when creating a package you should *at the very least*
provide a static library a client can statically link against. You
optionally may create a shared library for a client to link against, but
to do so you should *recompile* the whole package because things differ
now (this is how GHC works), – you can't simply link all your existing
object code (what you've produced the static library from) into this
shared library. But if you want to provide the single prelinked *.o file
(for GHC runtime linker consumption) you need no to perform any extra
compile step, you simply link all your object files (exactly those which
went to the package's static library) into this *.o file with 'ld -r'.
> IIUC, GHC is faster when handling .a files compared to a prelinked big
> .o file, even if they contain the same binary code/data. But it sounds
> like an artifact of the current implementation of GHC, because, in
> theory, there's no reason the former is much inefficient than the
> latter. If that's the case, doesn't it make more sense to improve GHC?
No. GHC **runtime** linker is much slower when handling *.a files (and
this is exactly the culprit of this whole story) since it goes through
the whole archive and links each object module separately doing all
resolutions and relocations and trampolines, than when linking already
prelinked big *.o file.
There are, perhaps, some confusions related to what GHC *runtime* linker
is. GHC runtime linker goes out into the scene when either GHC is used
interactively, or GHC encounters the code which it has to execute at
compile time (Template Haskell/quasiquotations). Thus GHC compiler must
link some external code during it's own run time.
HTH.
Cheers,
Kyra
More information about the llvm-dev
mailing list