2016-11-17 41 views
0

想象一下,我有ELF格式的共享庫,它只導出一個已確定調用約定的確定符號(入口點),並根本不導入任何符號。ELF共享庫可移植性

我可以在不同的UNIX版本(Linux,FreeBSD,Solaris)中共享dlopen/dlsym/dlclose這個共享庫嗎?

回答

2

我可以在不同的UNIX版本(Linux,FreeBSD,Solaris)中共享dlopen/dlsym/dlclose嗎?

假定你的庫是完全獨立的,不調用任何外部例程,也沒有任何問題的系統調用...答案是還沒有。

在ELF頭e_ident[EI_OSABI]字節,你將有一個ELFOSABI_GNUELFOSABI_FREEBSD,或ELFOSABI_SOLARIS。裝載程序將(或至少應該)拒絕爲「錯誤的」操作系統構建的庫的嘗試dlopen

但是,如果你修補一個字節以匹配當前操作系統,那麼dlopen可能會工作。

0

不,ELF加載程序和ELF文件的約定在操作系統以及用於與內核進行交互的系統調用之間是不同的。

可能編輯以更改加載,這樣在FreeBSD或Solaris裝載機接受了該文件,如果你只使用最起碼的subse它威力負載,但它不太可能你會能夠得到除此之外,除非它只是一個純粹的功能。

+0

共享庫內部沒有任何外部符號或系統調用。只有用戶空間代碼。 – user1641854

+0

「用戶空間代碼」不僅含糊不清。調用系統調用*是*用戶空間代碼。如果它只是數據處理功能(正如我所說的那樣,純功能),它可能在足夠的按摩功能下工作。但是,如果有什麼依賴於任何形式的共享狀態,那麼它根本不可能工作。除了FreeBSD之外,因爲它具有(已?)加載Linux ELF文件的能力。 –

+0

關於sysenter/trap /無論指令在ring2/nonprivileged代碼中是否可用,您都絕對正確。更清楚 - 我的意思是共享庫內的代碼是完全獨立的 - 外面沒有任何呼叫。 – user1641854