VineSeed ML アーカイブ



[VineSeed:024017] Re: [VineLinux:1209] clang- 2.9: LLVM バックエンドでコンパイル不可

  • From: NAKAMURA Kenta <kenta@xxxxxxxxxxxxx>
  • Subject: [VineSeed:024017] Re: [VineLinux:1209] clang- 2.9: LLVM バックエンドでコンパイル不可
  • Date: Sun, 28 Aug 2011 21:51:05 +0900
中村です。

llvm の Cフロントエンド clang で LLVM をバックエンドに指定して
コンパイルできないようです。
解決方法はありますが、全てをすぐに対応するのは大変そうなので
とりあえずbts に入れておきました。

$ clang sample.c 
/usr/bin/ld: cannot find crtbegin.o: No such file or directory
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: cannot find -lgcc_s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

また、llvmのビルド中にもメール末尾 (*1) に添付したようなテストの
エラーが起こっています。

原因のひとつはこれです。

   Bug 9798 - Linker flags fail / can't find crtbegin.o 
      http://llvm.org/bugs/show_bug.cgi?id=9798

こちらは、libgcc のサーチパスを追加する添付のパッチで対応できます。

ただ、これでは clang でバックエンドに llvm を使った場合に
コンパイルできない問題が残り対応としては不十分です。

$ clang sample.c 
$ clang -emit-llvm sample.c 
/tmp/cc-QzzmdA.o: file not recognized: File format not recognized
clang: error: linker command failed with exit code 1 (use -v to see invocation)


これは以下の問題になります。

   Bug 9897 - "File format not recognized" when compiling with -O4 
      http://llvm.org/bugs/show_bug.cgi?id=9897

この解決としては次の 3つの対応が必要となります。

   1. binutils を gold とプラグインを有効にしてビルドし直す
         --enable-gold=both と --enable-plugins を追加

   2. llvm で gold pulgin を有効にする
         -with-binutils-include=%{_includedir} --enable-pic を追加

   3. llvm で ld.gold を使うように変更
         メール末尾 (*2) に添付のパッチ

このうち、1については Vine 6の開発時点で binutils での gold サポートを
保留とした背景があります。
VineSeedでツールチェーンを更新するタイミングで gold も有効にして LLVM
側も修正を入れたいと思います。


--------------------------------
(*1) llvm-2.9-1vl7ビルド時のログ(抜粋)

--- Running clang tests for x86_64-unknown-linux-gnu ---
lit.py: lit.cfg:143: note: using clang: '/home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/Release/bin/clang'
-- Testing: 2918 tests, 4 threads --
Testing: 0 .. 10.. 20.. 30.. 40
FAIL: Clang :: Driver/hello.c (1287 of 2918)
******************** TEST 'Clang :: Driver/hello.c' FAILED ********************
Script:
--
/home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/Release/bin/clang  -ccc-echo -o /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.exe /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/hello.c 2> /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.log
grep 'clang\(-[0-9.]\+\)\?\(\.[Ee][Xx][Ee]\)\?" -cc1 .*hello.c' /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.log
/home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.exe > /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.out
grep "I'm a little driver, short and stout." /home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test/Driver/Output/hello.c.tmp.out
--
Exit Code: 1

********************
Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
Testing Time: 31.54s
********************
Failing Tests (1):
    Clang :: Driver/hello.c

  Expected Passes    : 2895
  Expected Failures  : 22
  Unexpected Failures: 1
make: *** [all] Error 1
make: Leaving directory `/home/kenta/work/VineLinux/rpm/BUILD/llvm-2.9/tools/clang/test'
+ exit 0
Processing files: llvm-2.9-1vl7.x86_64


--------------------------------
(*2) clang で明示的に ld.gold を選択するパッチ(x86_64の場合)

--- llvm-2.9/tools/clang/lib/Driver/ToolChains.cpp      2011-08-27 15:21:31.892964808 +0900
+++ llvm-2.9/tools/clang/lib/Driver/ToolChains.cpp      2011-08-27 15:51:30.858967386 +0900
@@ -1487,7 +1493,7 @@
   if (!llvm::sys::fs::exists(LinkerPath.str(), Exists) && Exists)
     Linker = LinkerPath.str();
   else
-    Linker = GetProgramPath("ld");
+    Linker = GetProgramPath("ld.gold");
 
   LinuxDistro Distro = DetectLinuxDistro(Arch);
 
--- llvm-2.9/tools/clang/lib/Driver/Tools.cpp   2011-08-28 18:42:57.183510696 +0900
+++ llvm-2.9/tools/clang/lib/Driver/Tools.cpp   2011-08-28 18:28:14.370510067 +0900
@@ -3731,7 +3731,7 @@
 
   if (Args.hasArg(options::OPT_use_gold_plugin)) {
     CmdArgs.push_back("-plugin");
-    std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
+    std::string Plugin = ToolChain.getDriver().Dir + "/../lib64/llvm/LLVMgold.so";
     CmdArgs.push_back(Args.MakeArgString(Plugin));
   }


==================================================
  NAKAMURA Kenta / 中村健太
  Mail: kenta@xxxxxxxxxxxxx
==================================================

Attachment: llvm-fix9798.patch
Description: Binary data

_______________________________________________
VineSeed mailing list
VineSeed@xxxxxxxxxxxxx
http://lists.vinelinux.org/mailman/listinfo/vineseed