読者です 読者をやめる 読者になる 読者になる

にゃははー

はへらー

Ubuntu 11.04以降で自前でgccをビルドした場合のアーキテクチャ依存ファイルについて

Ubuntu 11.04以降で幾つかのアーキテクチャ依存ファイルのパスが変更されてしまい、upstream GCCを自前コンパイルするとインクルードやリンクが通らないという問題があります。

通常、/etc/environmentに

CPATH=/usr/include/x86_64-linux-gnu
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu

などと書いておくと問題ないのですが、悲しいことにsudo経由等うまく環境変数を引き継げない場合にやはりエラーとなってしまいます。

ということでオープンソースなのでデフォルトで見るようにソースを書き換えましょう。

Ubuntu 12.04 amd64環境で、GCC 4.7.1 20120428(prerelease)時点でのdiffが以下のようになります。i686環境の人は追加部分のx86_64-linux-gnuをi386にすれば問題ないはずです。

--- gcc/collect2.c
+++ gcc/collect2.c
@@ -1363,6 +1363,7 @@
      AIX loader always searches for libraries.  */
   add_prefix (&libpath_lib_dirs, "/lib");
   add_prefix (&libpath_lib_dirs, "/usr/lib");
+  add_prefix (&libpath_lib_dirs, "/usr/lib/x86_64-linux-gnu");
 #endif
 
   /* Get any options that the upper GCC wants to pass to the sub-GCC.
--- gcc/gcc.c
+++ gcc/gcc.c
@@ -1100,6 +1100,9 @@
 #ifndef STANDARD_STARTFILE_PREFIX_2
 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
 #endif
+#ifndef STANDARD_STARTFILE_PREFIX_3
+#define STANDARD_STARTFILE_PREFIX_3 "/usr/lib/x86_64-linux-gnu/"
+#endif
 
 #ifdef CROSS_DIRECTORY_STRUCTURE  /* Don't use these prefixes for a cross compiler.  */
 #undef MD_EXEC_PREFIX
@@ -1139,6 +1142,8 @@
   = STANDARD_STARTFILE_PREFIX_1;
 static const char *const standard_startfile_prefix_2
   = STANDARD_STARTFILE_PREFIX_2;
+static const char *const standard_startfile_prefix_3
+  = STANDARD_STARTFILE_PREFIX_3;
 
 /* A relative path to be used in finding the location of tools
    relative to the driver.  */
@@ -6381,6 +6386,10 @@
 	add_sysrooted_prefix (&startfile_prefixes,
 			      standard_startfile_prefix_2, "BINUTILS",
 			      PREFIX_PRIORITY_LAST, 0, 1);
+      if (*standard_startfile_prefix_3)
+	add_sysrooted_prefix (&startfile_prefixes,
+			      standard_startfile_prefix_3, "BINUTILS",
+			      PREFIX_PRIORITY_LAST, 0, 1);
     }
 
   /* Process any user specified specs in the order given on the command
--- gcc/incpath.c
+++ gcc/incpath.c
@@ -459,7 +459,10 @@
 
   /* Finally chain on the standard directories.  */
   if (stdinc)
-    add_standard_paths (sysroot, iprefix, imultilib, cxx_stdinc);
+    {
+      add_standard_paths (sysroot, iprefix, imultilib, cxx_stdinc);
+      add_path ("/usr/include/x86_64-linux-gnu", SYSTEM, 1, false);
+    }
 
   target_c_incpath.extra_includes (sysroot, iprefix, stdinc);

ハードコーディングバンザイ