On Fri, Jan 27, 2017 at 10:05:38PM +1000, Patrick Wildt wrote: > Hi, > > Apparently if you convert a twine to a string (using str() on the Twine) > and setting that to a StringRef variable creates a broken string. This > means that the code never runs and thus never finds libc.so.x.y. It > falls back to picking up the .a files instead. > > Apparently you have to provide a scratch variable and use that one to > create a StringRef. This fixes the issue that the binaries are not > linked to any shared object. > > Now my lld-linked lld doesn't segfault directly but throws this. I do > consider this progress: > > # ./ld.lld > ld.lld:/usr/lib/libc++.so.0.0: undefined symbol '_ZTISt9bad_alloc' > ld.lld:/usr/lib/libc++.so.0.0: undefined symbol '_ZNSt9bad_allocD1Ev' > ld.lld:/usr/lib/libc++.so.0.0: undefined symbol '_ZNSt9bad_allocC1Ev' > ./ld.lld: error: no input files > ./ld.lld: error: target emulation unknown: -m or at least one .o file required
I think that issue might be because libc++ uses something from libc++abi but does not explicitly link to it. And we provide libc++abi as an ".a" only. > > ok? > > Patrick > > diff --git a/gnu/llvm/tools/lld/ELF/DriverUtils.cpp > b/gnu/llvm/tools/lld/ELF/DriverUtils.cpp > index 2c0b4405ba2..803b112120d 100644 > --- a/gnu/llvm/tools/lld/ELF/DriverUtils.cpp > +++ b/gnu/llvm/tools/lld/ELF/DriverUtils.cpp > @@ -184,7 +184,8 @@ Optional<std::string> elf::searchLibrary(StringRef Name) { > if (Optional<std::string> S = findFile(Dir, "lib" + Name + ".so")) > return S; > > - const StringRef LibName = (Twine("lib") + Name + ".so.").str(); > + llvm::SmallString<128> Scratch; > + const StringRef LibName = ("lib" + Name + ".so.").toStringRef(Scratch); > int MaxMaj = -1, MaxMin = -1; > std::error_code EC; > for (fs::directory_iterator LI(Dir, EC), LE;