萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 制作Linux的核心問題是什麼

制作Linux的核心問題是什麼

  制作Linux的核心問題:根目錄沖突(ld-linux.so位置

  由查找共享庫的過程我們知道,鏈接器ld-linux.so的位置是寫死在程序中的,那麼寫入的鏈接器的路徑到底是怎麼確定的呢?

  在程序的編譯過程中,gcc和binutils會查找C庫中的頭文件和共享庫,鏈接器也是在編譯過程中查找到的。至於是gcc還是binutils做的這工作我也不清楚,不過gcc和binutils一定是依賴於同一個C庫的,搜索的也是同一個C庫,所以不用考慮也可以。但一定要知道它們搜索的是哪個C庫。

  問題的產生

  由於我們制作的linux是在源系統中的一個文件夾中的,而我們編譯出來的程序的鏈接器還要指向目標系統的C庫,這就導致了程序中寫入的鏈接器的路徑含有了目標系統所在文件夾這一部分,但這是不對的。

  例如我們把/mylinux當做制作系統的根目錄,先編譯一個glibc在/mylinux文件夾中,再將工具鏈調整指向/mylinux中的glibc,之後編譯的程序就都指向了/mylinux中的glibc。

  可是制作的系統中的程序的鏈接器就變成了/mylinux/lib/ld-linux.so.X了。這樣我們把/mylinux中做好的系統放到一 個分區中啟動時,由於沒有/mylinux/lib/ld-linux.so.X這個鏈接器,所有程序都會因為找不到共享庫而不能運行(靜態編譯的除外)。

  如果你編譯過lfs,那你制作的tools和上面的/mylinux是一樣的,其中的程序的鏈接器為/tools/lib/ld-linux.so.2。你可以用ldd命令看一下。

  這個問題可以總結為鏈接器寫入程序的路徑是相對於根目錄的,而我們制作的系統不能占有根目錄,而造成鏈接器的位置編譯和運行時不一致。

copyright © 萬盛學電腦網 all rights reserved