學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 > 制作Linux的核心問題是什么

制作Linux的核心問題是什么

時間: 若木635 分享

制作Linux的核心問題是什么

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

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

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

  問題的產(chǎn)生

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

  例如我們把/mylinux當(dāng)做制作系統(tǒng)的根目錄,先編譯一個glibc在/mylinux文件夾中,再將工具鏈調(diào)整指向/mylinux中的glibc,之后編譯的程序就都指向了/mylinux中的glibc。

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

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

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

75423