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;

Reply via email to