ãã1ï¼Build llvm/clang/lldb/lld 3.5.0çç»ä»¶
ãã1.0 åå¤ï¼
ããè³å°éè¦ä»llvm.orgä¸è½½llvm, cfe, lldb, compiler-rt,lldç3.5.0çæ¬ç代ç ã
ãã$tar xf llvm-3.5.0.src.tar.gz
ãã$cd llvm-3.5.0.src
ãã$mkdir -p tools/clang
ãã$mkdir -p tools/clang/tools/extra
ãã$mkdir -p tools/lld
ãã$mkdir -p projects/compiler-rt
ãã$tar xf cfe-3.5.0.src.tar.xz -C tools/clang --strip-components=1
ãã$tar xf compiler-rt-3.5.0.src.tar.xz -C projects/compiler-rt --strip-components=1
ãã$tar xf lldb-3.5.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
ãã$tar xf lld-3.5.0.src.tar.xz -C tools/lld --strip-components=1
ãã1.1 ãå¯éã使ç¨clang --stdlib=libc++æ¶ï¼èªå¨æ·»å -lc++abiã
ããlibc++ç»ä»¶å¯ä»¥ä½¿ç¨gcc libstdc++çsupc++ ABIï¼ä¹å¯ä»¥ä½¿ç¨c++abiï¼cxxrtçï¼å®é
ä¸èªå¨æ·»å -lc++abiæ¯ä¸å¿
è¦çï¼è¿éè¿ä¹å¤çï¼ä¸»è¦æ¯ä¸ºäºæ¹ä¾¿èµ·è§ãå®é
ä¸å®å
¨å¯ä»¥å¨âclang++ -stdlib=libc++âæ¶åæ工添å -lc++abiç»é¾æ¥å¨ã
ããè¿éæ¶åå°é¾æ¥æ¶DSOéå¼è¿æ¯æ¾å¼çé®é¢ï¼æ©äºæ¶åldå¨é¾æ¥åºæ¶ä¼èªå¨å¼å
¥ç±åºå¼å
¥çä¾èµå¨æåºï¼åæ¥å 为è¿ä¸ªè¡ä¸ºçä¸å¯æ§æ§ï¼æ以ldé¾æ¥å¨çè¡ä¸ºåäºä¿®æ¹ï¼éè¦æ¾å¼çåæææéè¦é¾æ¥çå¨æåºï¼æä¼ææ工添å -lc++abiè¿ç§æ
åµåºç°ã
ãã--- llvm-3.0.src/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 18:49:06.663029075 +0800
ãã+++ llvm-3.0.srcn/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 19:36:04.260071355 +0800
ãã@@ -251,6 +251,7 @@
ããswitch (Type) {
ããcase ToolChain::CST_Libcxx:
ããCmdArgs.push_back("-lc++");
ãã+ CmdArgs.push_back("-lc++abi");
ããbreak;
ããcase ToolChain::CST_Libstdcxx:
ãã1.2 ãå¿
è¦ãç»clang++æ·»å -fnolibgccå¼å
³ã
ããè¿ä¸ªå¼å
³ä¸»è¦ç¨æ¥æ§å¶æ¯å¦è¿æ¥å°libgccæè
libunwindã
ãã注ï¼libgccä¸çäºlibunwindãlibgcc_eh以åsupc++çä¸é¨åè·libunwindåè½ç¸å½ã
ãã注ï¼libgcc_såcompiler_rtçä¸é¨åç¸å½ã
ããè¿ä¸ªè¡¥ä¸æ¯å¿
è¦çï¼ ä¸ä¼å¯¹clangçæ£å¸¸ä½¿ç¨é æä»»ä½å½±å ï¼åªæå¨ä½¿ç¨â-fnolibgcc"åæ°æ¶æä¼èµ·ä½ç¨ã
ããä¹æ以è¿è¡äºå¾å¤unwindçå¼å
¥ï¼ä¸»è¦æ¯ä¸ºäºé¿å
ä¸å¿
è¦ç符å·ç¼ºå¤±éº»ç¦ï¼è¿éçå¤çç¸å¯¹æ¥è¯´æ¯å¹²åçï¼éè¿as-neededè§é¿äºä¸å¿
è¦çå¼å
¥ã
ãã--- llvm-static-3.5.0.bak/tools/clang/lib/Driver/Tools.cpp 2014-09-10 13:46:02.581543888 +0800
ãã+++ llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp 2014-09-10 16:03:37.559019321 +0800
ãã@@ -2060,9 +2060,15 @@
ãã".a");
ãã
ããCmdArgs.push_back(Args.MakeArgString(LibClangRT));
ãã- CmdArgs.push_back("-lgcc_s");
ãã- if (TC.getDriver().CCCIsCXX())
ãã- CmdArgs.push_back("-lgcc_eh");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc)) {
ãã+ CmdArgs.push_back("--as-needed");
ãã+ CmdArgs.push_back("-lunwind");
ãã+ CmdArgs.push_back("--no-as-needed");
ãã+ } else {
ãã+ CmdArgs.push_back("-lgcc_s");
ãã+ if (TC.getDriver().CCCIsCXX())
ãã+ CmdArgs.push_back("-lgcc_eh");
ãã+ }
ãã}
ãã
ããstatic void addProfileRT(
ãã@@ -7150,24 +7156,50 @@
ããbool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
ããbool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
ããArgs.hasArg(options::OPT_static);
ãã+
ãã+
ãã+
ããif (!D.CCCIsCXX())
ãã- CmdArgs.push_back("-lgcc");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc)) {
ãã+ CmdArgs.push_back("--as-needed");
ãã+ CmdArgs.push_back("-lunwind");
ãã+ CmdArgs.push_back("--no-as-needed");
ãã+ } else
ãã+ CmdArgs.push_back("-lgcc");
ãã
ããif (StaticLibgcc || isAndroid) {
ããif (D.CCCIsCXX())
ãã- CmdArgs.push_back("-lgcc");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc)) {
ãã+ CmdArgs.push_back("--as-needed");
ãã+ CmdArgs.push_back("-lunwind");
ãã+ CmdArgs.push_back("--no-as-needed");
ãã+ } else
ãã+ CmdArgs.push_back("-lgcc");
ãã} else {
ããif (!D.CCCIsCXX())
ããCmdArgs.push_back("--as-needed");
ãã- CmdArgs.push_back("-lgcc_s");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc))
ãã+ CmdArgs.push_back("-lunwind");
ãã+ else
ãã+ CmdArgs.push_back("-lgcc_s");
ããif (!D.CCCIsCXX())
ããCmdArgs.push_back("--no-as-needed");
ãã}
ãã
ããif (StaticLibgcc && !isAndroid)
ãã- CmdArgs.push_back("-lgcc_eh");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc)) {
ãã+ CmdArgs.push_back("--as-needed");
ãã+ CmdArgs.push_back("-lunwind");
ãã+ CmdArgs.push_back("--no-as-needed");
ãã+ } else
ãã+ CmdArgs.push_back("-lgcc_eh");
ããelse if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
ãã- CmdArgs.push_back("-lgcc");
ãã+ if (Args.hasArg(options::OPT_fnolibgcc)) {
ãã+ CmdArgs.push_back("--as-needed");
ãã+ CmdArgs.push_back("-lunwind");
ãã+ CmdArgs.push_back("--no-as-needed");
ãã+ } else
ãã+ CmdArgs.push_back("-lgcc");
ãã
ãã// According to Android ABI, we have to link with libdl if we are
ãã// linking with non-static libgcc.
ãã--- llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td 2014-08-07 12:51:51.000000000 +0800
ãã+++ llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td 2014-09-10 13:36:34.598511176 +0800
ãã@@ -788,6 +788,7 @@
ããdef fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
ããdef fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
ããdef fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>, Flags<[CC1Option]>;
ãã+def fnolibgcc : Flag<["-"], "fnolibgcc">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
ããdef fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
ããdef foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
ããdef force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
ãã1.3 llvmçå
¶ä»è¡¥ä¸ã
ããllvm/clangå°gcc toolchainçè·¯å¾hard codeå¨ä»£ç ä¸ï¼è¯·æ¥é
tools/clang/lib/Driver/ToolChains.cppã
ããæ¾å°x86_64-redhat-linuxä¹ç±»çå符串ã
ããå¦æ没æä½ ç³»ç»ç¹æçgcc tripple stringï¼è¯·èªè¡æ·»å ã
ããè¿ä¸ªtripple string主è¦æ¯ç»llvm/clangæç´¢gcc头æ件ç使ç¨çï¼ä¸å½±åæ¬æè¦æ建çtoolchain
ãã1.4 æ建clang/llvm/lldb
ããæ¬æ使ç¨ninjaã顺便说ä¸ä¸ï¼llvmæ¯æconfigureåcmake两ç§æ建æ¹å¼ãå¯è½æ¯å 为工ç¨å¤ªå¤§ï¼è¿ä¸¤ç§æ建æ¹å¼çå·¥ç¨æ件é½æåç§ç¼ºé·ï¼ä¸»è¦è¡¨ç°å¨å¼å
³é项ä¸ï¼æ¯å¦configureæï¼ä½æ¯cmakeå´æ²¡æçï¼ãllvm-3.4.1å°±æ¯å 为cmakeå·¥ç¨æ件çé误è导è´äº3.4.2çæ¬çåå¸ã
ãã综åèè¨ï¼cmake+ninjaçæ¹å¼æ¯ç®åæå¿«çæ建æ¹å¼ä¹ä¸ï¼å¯ä»¥å°æ建æ¶é´ç¼©çä¸å以ä¸ã
ããmkdir build
ããcd build
ããcmake \
ãã-G Ninja \
ãã-DCMAKE_INSTALL_PREFIX=/usr \
ãã-DCMAKE_BUILD_TYPE="Release" \
ãã-DCMAKE_CXX_FLAGS="-std=c++11" \
ãã-DBUILD_SHARED_LIBS=OFF \
ãã-DLLVM_ENABLE_PIC=ON \
ãã-DLLVM_TARGETS_TO_BUILD="all" \
ãã-DCLANG_VENDOR="MyOS" ..
ããninja
ããninja install
ããå¦æç³»ç»åæ¥å°±æclang/clang++çå¯ç¨çæ¬ï¼å¯ä»¥æ·»å ï¼
ãã-DCMAKE_C_COMPILER=clang \
ãã-DCMAKE_CXX_COMPILER=clang++ \
ããè¿æ ·å°±ä¼ä½¿ç¨ç³»ç»çclang++æ¥æ建llvm/clang
ãã2ï¼æµè¯clang/clang++ã
ããèªå·±æ¾å 个ç®åçc/cpp/objcçç¼è¯æµè¯ä¸ä¸å³å¯ãå®æ´æµè¯å¯ä»¥å¨æ建æ¶ä½ninja check-all
ãã3ï¼libunwind/libc++/libc++abiï¼ä¸å¥ä¸ä¾èµlibgcc, libstdc++çc++è¿è¡åºã
ãã3.1 ä»
https://github.com/pathscale/libunwind è·å代ç ã
ããlibunwindæå¾å¤ä¸ªå®ç°ï¼æ¯å¦gnuçlibunwind, path64çlibunwindï¼è¿ælibcxxabièªå¸¦çUnwinder.
ããè¿éä½ä¸è¯´æï¼
ãã1)ï¼gnuçlibunwindä¼æ符å·ç¼ºå¤±åå²çªã
ãã2)ï¼libcxxabièªå¸¦çUnwinderæ¯ç»macåiosç¨çï¼ä¹å°±æ¯åªè½å¨darwinä½ç³»æ建ãç®åLinuxçå®ç°ä»ç¶ä¸å
¨ï¼çlinuxå®ç°å®æ´äºæ许就ä¸åéè¦path64çunwindå®ç°äºã
ããææ¶å»ºè®®ä½¿ç¨pathscaleçunwindå®ç°ã
ããmkdir -p build
ããcd build
ããcmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="-m64" ..
ããninja
ããmkdir -p /usr/lib
ããcp src/libunwind.so /usr/lib
ããcp src/libunwind.a /usr/lib
ãã3.2 第ä¸æ¬¡æ建libcxx.
ããå¿
é¡»å
æ建ä¸æ¬¡libcxxï¼ä»¥ä¾¿åé¢æ建libcxxabiãè¿éæ建çlibcxxå®é
ä¸æ¯ä½¿ç¨gccçlibgcc/stdc++/supc++çã
ããæä¸è¿ä¸ªè¡¥ä¸æ¥ç¦æ¢libgccçå¼å
¥ï¼
ããdiff -Nur libcxx/cmake/config-ix.cmake libcxxn/cmake/config-ix.cmake
ãã--- libcxx/cmake/config-ix.cmake 2014-06-25 06:57:50.000000000 +0800
ãã+++ libcxxn/cmake/config-ix.cmake 2014-06-25 09:05:24.980350544 +0800
ãã@@ -28,5 +28,4 @@
ããcheck_library_exists(c printf "" LIBCXX_HAS_C_LIB)
ããcheck_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
ããcheck_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
ãã-check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
ããç¼è¯å®è£
ï¼
ããmkdir build
ããcd build
ããcmake \
ãã-G Ninja \
ãã-DCMAKE_INSTALL_PREFIX=/usr \
ãã-DCMAKE_C_COMPILER=clang \
ãã-DCMAKE_CXX_COMPILER=clang++ \
ãã..
ããninja
ããninja install
ãã3.3ï¼æµè¯ç¬¬ä¸æ¬¡æ建çlibcxxã
ãã使ç¨"clang++ -stdlib=libc++ -o test test.cpp -lstdc++"ç¼è¯ç®åc++代ç ï¼æ£æ¥æ¯å¦åºéã(å¦æåé¢æ建clangæ¯å·²ç»applyäºc++abiçé¾æ¥è¡¥ä¸ï¼è¿éä¼åºç°æ¾ä¸å°c++abiçæ
åµï¼è·³è¿å³å¯)
ãã使ç¨"ldd test"æ¥çtestäºè¿å¶å¨æåºä½¿ç¨æ
åµãå¯ä»¥åç°ï¼testä¾èµäºlibgcc_s/libc++/libstdc++ãï¼å¤å°æäºä¸ç½äºå§ï¼ä½¿ç¨äºlibc++å±
ç¶è¿è¦ä¾èµlibstdc++ï¼ï¼