1. 下載源碼
wget http://mirrors.kernel.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz
2. 解壓
sudo tar -xvf gcc-5.4.0.tar.gz
3. 下載編譯所需依賴項:
cd gcc-5.4.0
sudo ./contrib/download_prerequisites //下載依賴項,只能在此目錄下執行
cd ..
4. 建立編譯輸出目錄
sudo mkdir gcc-build-5.4.0
5. 進入輸出目錄,執行以下命令,並生成makefile文件
cd gcc-build-5.4.0
sudo ../gcc-5.4.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
6. 編譯
sudo make -j4
(若編譯出錯且沒有報錯信息,使用sudo make編譯,此處時間較長)
7. 安裝
sudo make install
8. 檢查版本
gcc --version
附編譯報錯信息:
1. 報錯:configure: error: in `/usr/local/src/gcc-5.4.0/build':
解決:缺少gcc需要先安裝一個任意gcc版本
2. 報錯:dereferencing pointer to incomplete type 'struct ucontext'
解決:將61行左右struct ucontext * uc_ = context->cfa
改成 struct ucontext_t * uc_ = context->cfa
3. 報錯:/sanitizer_stoptheworld_linux_libcdep.cc:237:22:
error: aggregate 'sigaltstack handler_stack' has incomplete type and cannot be defined struct sigaltstack handler_stack;
解決:將/sanitizer_stoptheworld_linux_libcdep.cc中第237行
struct sigaltstack handler_stack;
修改為:stack_t handler_stack;
4. 報錯:……// sanitizer_linux.h
解決:將第二行注釋
struct link_map; // Opaque type returned by dlopen().
struct sigaltstack;
將 uptr internal_sigaltstack(const struct sigaltstack* ss, struct sigaltstack* oss);
修改為:uptr internal_sigaltstack(const void* ss, void* oss);
5. 報錯:……// sanitizer_linux.cc
將uptr internal_sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss)
修改為:uptr internal_sigaltstack(const void *ss, void *oss)
6. 報錯:……// sanitizer_stoptheworld_linux_libcdep.cc
將struct sigaltstack handler_stack;
修改為: stack_t handler_stack;
7. 報錯:……//tsan_platform_linux.cc
將res_state *statp = (__res_state*)state;
修改為:struct __res_state *statp = (struct __res_state*)state;
8. 報錯:……// asan_linux.cc
解決:在asan_linux.cc中添加頭文件#include <signal.h>即可