[cfe-dev] Strange clang behavior when compiled against musl

Reid Kleckner via cfe-dev cfe-dev at lists.llvm.org
Fri Dec 9 08:32:36 PST 2016


Clang uses this logic in llvm/lib/Support/Unix/Path.inc to find itself (
https://github.com/llvm-mirror/llvm/blob/84d1e9104a43f9940a76467d58156ade4b1c8d52/lib/Support/Unix/Path.inc#L170
):

...
#elif defined(__linux__) || defined(__CYGWIN__)
  char exe_path[MAXPATHLEN];
  StringRef aPath("/proc/self/exe");
  if (sys::fs::exists(aPath)) {
      // /proc is not always mounted under Linux (chroot for example).
      ssize_t len = readlink(aPath.str().c_str(), exe_path,
sizeof(exe_path));
      if (len >= 0)
          return std::string(exe_path, len);
  } else {
      // Fall back to the classical detection.
      if (getprogpath(exe_path, argv0))
        return exe_path;
  }
#elif defined(HAVE_DLFCN_H)
...

Presumably we are hitting the else, which would explain the bad behavior in
the first example, where clang uses the musl loader for the -cc1 action. I
don't know what went wrong in the chroot.

You can send patches to llvm-commits at lists.llvm.org and file bugs at
http://llvm.org/bugs.

Thanks for looking into this!

On Fri, Dec 9, 2016 at 1:42 AM, Dmitry Golovin via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> I have managed to compile llvm and clang against musl, but it behaves
> really strange:
>
> At first I tried to launch the compiler with musl dynamic loader:
>
>     $ LD_LIBRARY_PATH=/path/to/musl/lib /path/to/musl/lib/ld-musl-x86_64.so.1
> /path/to/llvm/bin/clang -v
>     clang version 4.0.0 (https://github.com/llvm-mirror/clang
> 40adebeca0f99006d407508653c2cbd270a1a51c) (https://github.com/llvm-
> mirror/llvm 943496ffc4e7cb9d7dd6f5119325a7583e2cc31f)
>     Target: x86_64-pc-linux-musl
>     Thread model: posix
>     InstalledDir: /path/to/llvm/bin
>
> It worked, but couldn't compile binaries:
>
>     $ LD_LIBRARY_PATH=/path/to/musl/lib /path/to/musl/lib/ld-musl-x86_64.so.1
> /path/to/llvm/bin/clang -v -c hello.c
>     clang version 4.0.0 (https://github.com/llvm-mirror/clang
> 40adebeca0f99006d407508653c2cbd270a1a51c) (https://github.com/llvm-
> mirror/llvm 943496ffc4e7cb9d7dd6f5119325a7583e2cc31f)
>     Target: x86_64-pc-linux-musl
>     Thread model: posix
>     InstalledDir: /path/to/llvm/bin
>      "/path/to/musl/lib/ld-musl-x86_64.so.1" -cc1 -triple
> x86_64-pc-linux-musl -emit-obj -mrelax-all -disable-free
> -disable-llvm-verifier -discard-value-names -main-file-name hello.c
> -mrelocation-model static -mthread-model posix -mdisable-fp-elim
> -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables
> -target-cpu x86-64 -v -dwarf-column-info -debugger-tuning=gdb
> -coverage-notes-file /path/to/hello/hello.gcno -resource-dir
> /path/to/musl/lib/clang/4.0.0 -isysroot /path/to/musl -internal-isystem
> /path/to/musl/usr/local/include -internal-isystem
> /path/to/musl/lib/clang/4.0.0/include -internal-externc-isystem
> /path/to/musl/include -internal-externc-isystem /path/to/musl/usr/include
> -fdebug-compilation-dir /path/to/hello -ferror-limit 19 -fmessage-length 80
> -fobjc-runtime=gcc -fdiagnostics-show-option -o hello.o -x c hello.c
>     /path/to/musl/lib/ld-musl-x86_64.so.1: cannot load -cc1: No such file
> or directory
>
> As you can see it is trying to execute a compilation command with omitted
> clang binary path.
>
> So I thought that it would work in chroot with nothing but musl and clang
> in it. So I chrooted to a newly created directory, put musl and clang in
> it, and it still didn't work:
>
>     (chroot)$ clang -v -I/include -c hello.c
>     clang version 4.0.0 (https://github.com/llvm-mirror/clang
> 40adebeca0f99006d407508653c2cbd270a1a51c) (https://github.com/llvm-
> mirror/llvm 943496ffc4e7cb9d7dd6f5119325a7583e2cc31f)
>     Target: x86_64-pc-linux-musl
>     Thread model: posix
>     InstalledDir: /bin
>      "" -cc1 -triple x86_64-pc-linux-musl -emit-obj -mrelax-all
> -disable-free -disable-llvm-verifier -discard-value-names -main-file-name
> hello.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim
> -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables
> -target-cpu x86-64 -v -dwarf-column-info -debugger-tuning=gdb
> -coverage-notes-file /hello/hello.gcno -resource-dir ../lib/clang/4.0.0 -I
> /include -isysroot /path/to/musl -internal-isystem /path/to/musl/usr/local/include
> -internal-isystem ../lib/clang/4.0.0/include -internal-externc-isystem
> /path/to/musl/include -internal-externc-isystem /path/to/musl/usr/include
> -fdebug-compilation-dir /hello -ferror-limit 19 -fmessage-length 139
> -fobjc-runtime=gcc -fdiagnostics-show-option -o hello.o -x c hello.c
>     error: unable to execute command: Executable "" doesn't exist!
>
> So it still doesn't launch clang as it should. But if I just copy and
> paste the produced line replacing `""` with `clang` it works and produces
> fine object file.
>
> What else can I try to make it work? Does clang have public bugzilla?
>
> Where can I send my musl support patches?
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161209/d9a91954/attachment.html>


More information about the cfe-dev mailing list