Linux-Kernel
用新的 gcc 編譯舊核心
我正在嘗試使用目前的 gcc-6.3 在我的 Linux 機器上編譯舊版本的 Linux (3.4)。但是執行 make 命令會顯示如下錯誤:
scripts/kconfig/conf.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
而且我還沒有找到任何解決方案。似乎 gcc 需要對 3.4 核心配置文件未要求的某些對象使用 fPIC 標誌。最好我不想觸及核心預設值。我應該如何要求 gcc 停止要求此標誌或禁用它?
無論我解決了什麼錯誤,下一次編譯嘗試都會出現一個新錯誤。不幸的是,我發現最好的解決方案是使用舊的 gcc 來編譯這個核心。
我的猜測是您使用的 gcc 版本經過修改以預設生成 PIE(與位置無關的執行檔)。根據這個頁面,至少 Ubuntu 已經完成了這個切換。目錄中的程式碼
scripts/kconfig
用於未連結到核心的輔助程序,並且(afaik)不連結到外部靜態庫。因此,預設值是什麼並不重要,除非您在以前的執行中有一些剩餘的編譯器版本具有不同的預設值。執行make clean
並重新編譯。如果這沒有幫助,請查看目前核心的Makefile
-no-pie
,它強制.