根目錄沖突(ld-linux.so位置)解決方法
解決方法一:不追求標准
啟動方法一
把上例中/mylinux文件夾放到分區中,在分區中新建linux結構,把啟動時用的文件外面做指向/mylinux中對應文件的鏈接,如mount等命令和/sbin/init程序等。在lfs中制作目標系統時會chroot進/mnt/lfs文件夾中,這之前為chroot做的工作和我要說的是類似的,不懂的可以看看。
啟動方法二
也可以把/mylinux的內容放到分區中,然後做一個鏈接/mylinux/lib/ ld-linux.so.2鏈接到/lib/ld-linux.so.2。
上面的方法都是為保持鏈接器的正確位置,但這就不是標准linux了。
解決方法二:臨時工具鏈
這種方法的思想是做一個根不是/的linux系統,再用這個系統制作標准的linux系統,這樣就不會有根沖突問題了。
根不/的linux系統是怎麼做的呢?其實就是上面說的/mylinux中的系統,在lfs中的/tools中的系統。
上面解決方法一中可知,根不是/的linux系統是可以啟動的,用解決方法一中的啟動方法一啟動系統,再用這個系統制作linux就可以占用根目錄/了。因為啟動的系統在目錄/mylinux中(LFS中為/tools)。這樣制作的linux就是標准結構了。
解決方法三:sysroot
根沖突的問題還可以理解為gcc和binutils的搜索路徑和編譯程序的根路徑的沖突問題。第一步編譯好目標系統的C庫(一般為glibc)後,再編譯程序就要用剛編譯好的目標系統的C庫了。也就是在編譯時要搜索剛編譯好的目標系統的C庫。但這樣編譯出的程序的中路徑就不是相對於根目錄/的了。
如果我們能單指定gcc和binutils的搜索路徑,不改變編譯設置,這樣問題不用解決了嗎?
這種功能可以通過sysroot設定,在編譯gcc和binutils時在configure的參數中加入--with-sysroot=<制作linux的根文件夾>,可以設置搜索路徑,使編譯過程中用的是指定的C庫,而編譯出的程序確是相對於根目錄/的。
這樣編譯出的linux中的程序的鏈接器ld-linux.so.X的路徑就正確了。這樣就可以把制作的linux直接移到分區中啟動了。
這是借鑒CLFS sysroot也可以叫CLFS3.0中的方法。
這種方法的好處是只要做好交叉編譯的gcc和binutils就可以了,利用源系統中的輔助工具進行編譯。用sysroot一般是在交叉編譯中,同平台的本地編譯是交叉編譯的一個子集,可以用在交叉編譯中的方法也可以用在本地編譯中。