2010-12-09 30 views
5

我必須在zOS中創建一個動態鏈接的庫。什麼是傳遞給編譯器的選項。在zOS中的動態鏈接

此外,如何檢查zOS中的庫是否在其他庫上動態鏈接[依賴]。我們在linux下有ldd,它顯示了這個鏈接。我們在zOS土地上是否有'ldd'等價物?

+0

你有沒有簽出[建立和使用動態鏈接庫](http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01 /dllsim.htm)? – NealB 2010-12-10 16:15:43

回答

2

你不直接說,但我假設你的意思是一個C/C++ DLL。您也可以使用其他語言(甚至是彙編程序)來執行共享庫,但步驟會有所不同。

首先,您需要決定要導出的內容。許多IBM示例使用編譯器EXPORTALL指令,但請注意,這可能會導致非常慢的可執行文件,具體取決於您的編碼風格。如果你不做EXPORTALL,你需要#pragma export來導出你想要導出的任何東西(代碼或數據)。不要忘記,您可以導出數據(變量)以及可執行函數......有時您需要使用它來與DLL函數共享數據。

然後,你需要設置兩個客戶端(主叫)和DLL的編譯選項使用DLL聯動......這是-Wc,DLL編譯選項啓用時,它會產生額外的邏輯程序來加載和管理DLL。如果您認爲您需要更新DLL而無需完全替換它,那麼在您的導出函數中也包含#pragma csect是個好主意。

當你鏈接你的DLL時,一定要指定-Wl​​,DLL選項(有很多方法......如果你批量鏈接,這部分是不同的 - 我假設你正在構建一個make某種文件)。該鏈接將生成實際的DLL,以及包含所有導出函數的「IMPORT」語句的「side deck」。您將需要這些鏈接來鏈接您期望調用該DLL的任何客戶端程序。例如,如果您的導入位於名爲AAA.x,c89 -Wc的文件中,則DLL myapp.c AAA.x將編譯調用代碼,並知道AAA.x中的函數在某種類型的DLL中關閉。

關於調用其他DLL的DLL,不要忘記一個DLL既可以「服務」也可以「消耗」函數......通過在其他DLL中包含函數的側邊欄,可以有一個DLL在調用其他DLL訪問其他DLL時提供了一些功能。

實際的DLL本身可以在幾個地方,這取決於您的應用程序的性質。如果你對UNIX服務友好,它只是LIBPATH中的一個可執行文件。它也可以是STEPLIB,LNKLST,LPA等等。

如果需要,您可以在運行時使用dlopen(),dlsym()等顯式訪問您的DLL。一般來說,這可以讓你精確地控制你正在使用的DLL(如果用戶可以自己提供的話,有時候會很方便),並且它給你提供了在DLL中解析的函數指針的數量。

鏈接時還有一些基本的事情需要考慮,比如確保代碼是可重入的。其中大部分內容在IBM文檔中有詳細說明,如果您使用「c89」(或同等產品)進行構建,則通常會爲您自動設置正確的選項(實際上,爲了弄清楚發生了什麼,在詳細輸出上,並查看您自己的所有參數)。

如果您需要建立什麼叫什麼的交叉引用,UNIX服務「nm」命令可以爲您提供該信息。如果您生成詳細的鏈接編輯列表,那麼當您構建DLL時,所有數據也都在其中。

祝你好運!