2011-12-15 65 views
2

假設我們有一個非常小的嵌入式系統,只包含linux內核和一個靜態鏈接的二進制文件作爲init。我們希望二進制文件能夠在運行時動態加載外部插件。Linux:是否可以使用靜態鏈接的二進制文件進行一些面向插件的編程?

是否可以在Linux上? Dlopen僅適用於共享庫和動態鏈接,因此靜態二進制文件不會將任何符號導出到外部世界,那麼還有其他方法可以實現嗎?

回答

1

的dlopen只與共享庫和動態鏈接的原因靜態二進制工作原理不任何符號導出到外面的世界

可以的dlopen從靜態鏈接的二進制共享庫使用glibc時。如果您需要插件引用主可執行文件中的符號,則必須將指針傳遞給插件,類似於this

是否有任何其他方式做到這一點?

你也可以寫你自己的模塊加載。 Linux內核執行此操作,Xorg也是如此。

+0

我是否能夠通過C++類的成員函數到插件中呢?例如通過傳遞一個指向extern C函數的指針來分配一個C++類並返回一個void指針給它?我不認爲它可以自行工作 - 插件不會知道成員函數符號,但有沒有辦法從插件內部訪問它們? – Zbigh1 2011-12-16 08:23:55

4

你可以運行「插件」的子進程,並交流了IPC(共享內存,管道,等等)。

它們將存在於它們自己的進程空間中,因此您不能直接調用它們中的函數(除此之外,如果它們也是靜態鏈接的,除了main之外,您可能無法訪問其他任何函數入口點),但您可以(例如)通過命名管道發送命令,或者在共享內存結構中傳遞數據。那,那一刻你加載第二個二進制

注意,你已經失去的靜態鏈接的主要好處之一(因爲現在你有你的libc裝的一分式兩份),所以你可能要考慮只是咬咬牙,使用動態鏈接。你會燒幾100K在加入動態鏈接支持,但GNU libc是2M左右,所以如果你加載一個插件,你的儲蓄已經獲得也許1.8M;對於您加載的每個附加插件,您都節省了大約2M。