
由於某些原因,我正在嘗試修改和測試我自己的 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 克隆是一種快速的寫入時複製,以真實的根資料集作為其來源。