FreeBSD 測試 rtld

FreeBSD 測試 rtld

由於某些原因,我正在嘗試修改和測試我自己的 rtld 版本(ld-elf.so.1)。每次對此連結器進行更改後,我都需要重新啟動系統,從 CD/DVD 啟動它,在 /libexec/ 中安裝我的版本,然後再次重新啟動系統。有時,由於分段錯誤,它甚至不運行用戶空間。我在這樣的過程中浪費了很多時間。

我想問如何從命令列啟動此連結器,而無需在 /libexec 中重新安裝 rtld 並重新啟動系統。是否可以像 Linux /lib/ld-linux.so.2 一樣運行 rtld?

我嘗試運行 ld-elf.so.1 但每次都會出現分段錯誤。可能我錯過了 rtld 命令列中的一些參數。關於如何從命令列運行 rtld 有什麼建議嗎?

也許我可以更改可執行檔的預設解釋器?

編輯:作為我的 rootfs 的檔案系統,我使用 UFS。

答案1

是否可以像Linux一樣運行rtld /lib/ld-linux.so.2

是的,/libexec/ld-elf.so.1 /path/to/your_binary在 FreeBSD 上運行得很好,就像在 Linux 上一樣。

也許我可以更改可執行檔的預設解釋器?

是的,您可以在編譯二進位檔案時通過cc -Wl,-dynamic-linker=/path/to/your_interpreter.這-Wl,..是 gcc/clang 將參數直接傳遞給連結器的方式,您可以查看線上說明頁面以獲取對其和其他標誌ld(1)的解釋。--dynamic-linker

我嘗試運行ld-elf.so.1,但每次都會遇到分段錯誤。

動態連結器/解釋器應編譯為位置獨立 ( -pie),本身不能依賴共享對象,或使用其他解釋器。

答案2

對於我的 rootfs,我使用 UFS。

這很遺憾,因為 ZFS 的答案非常簡單。也許您會將此視為轉換的理由。

只要作業系統的靜態部分都在一個資料集上,您就可以建立一個 ZFS複製資料集的資料集,將其掛載到某個子目錄中,修改那裡的載入程式(或您想要修改的任何內容),然後建立以該子目錄為根的監獄。這提供了作業系統的寫入時複製副本,但使用了修改後的載入程序,就地就像作為主加載程式安裝一樣(這是就監獄而言)。

(TrueOS 展示了這種方法,為根提供一個大數據集,並/usr有效地為諸如 、 和 之類的單獨數據集修剪/var/*/tmp/usr/{obj,src,ports,jails,home}

這種方法消除了jail手冊頁和手冊第 14 章中概述的冗長過程。FreeBSD 手冊,用於設定監獄目錄樹,涉及在監獄的根目錄中建立作業系統的完整副本。 ZFS 克隆是一種快速的寫入時複製,以真實的根資料集作為其來源。

相關內容