Re: lld: fix library search

2017-01-27 Thread Patrick Wildt
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 elf::searchLibrary(StringRef Name) {
>if (Optional 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;



lld: fix library search

2017-01-27 Thread Patrick Wildt
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

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 elf::searchLibrary(StringRef Name) {
   if (Optional 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;