2010-01-20 29 views
0

我爲長期的問題提前道歉,但我想確保我沒有遺漏任何可能會改變你的反應的關鍵點。混淆exe的靜態編譯agaisnt不同版本的圖書館w /共享內存

我負責維護寫成「C」,而我們有一些共同的「一個」庫系統軟件。我們稱之爲「執行管理器」的主要工作是分叉和執行「測試作業」可執行文件的變量列表,並在測試作業過程終止後將控制權返還給執行管理器。所有可執行文件,包括執行管理器,都與上述庫靜態鏈接。執行管理器和測試工作進程通過共享內存分叉使用IPC。其中一個通用庫包含包裝函數,用於創建並附加永久不會更改的預定義密鑰的共享內存。

幾個月前,我們鎖定了我們的軟件(測試工作以及執行管理器),靜態編譯它們並釋放他們有與測試工作「發麪」。從那時起,有一些要求對執行管理器進行更改的請求,這將需要改變選定的少數通用庫函數。但是,管理層已經決定,他們不希望針對新版本的公共庫重新編譯測試作業,因爲這需要他們重新校對他們目前擁有的測試作業可執行文件;而且他們不想花錢去做那件事。

因爲所有的可執行文件進行靜態編譯,我通常會說混合測試工作靜態編譯針對不同版本的同一公共庫的將不會是一個問題的執行經理。然而,通過共享內存包含IPC讓我懷疑這是否仍然如此。我的直覺是,只要共享內存包裝函數沒有改變,尤其是關鍵,那麼我們應該沒問題,但我真的可以在這方面使用一些專家意見。

感謝百忙之中閱讀本文時,大加讚賞。

回答

2

你應該可以,只要定義流程如何通過共享內存互相交談的數據結構和協議沒有改變。 (也就是說,這兩個進程之間存在的小ABI)。

+0

這可以通過向存儲在shm中的數據添加版本字段來實現;如果應用程序無法處理數據結構版本,它可以查找現有值並返回錯誤。 – 2010-01-20 05:50:38

+0

謝謝你們對於這件事情需要保持一致的事情再次保證和澄清。我非常喜歡版本領域的想法,但它有點像捕捉22,因爲它添加有點太晚了。也許有一個現有的元數據領域,我可以加入一個版本。 另外,如果你不介意可以看看我對BobS的帖子的評論,並讓我知道我的理解是否正確。再次感謝。 – SiegeX 2010-01-20 06:20:08

1

我想證實什麼caf說。您已正確識別了關鍵位:用於訪問共享內存的密鑰和包裝函數。這些位不關心它們是否在.o文件中定義,它們是否是.a文件的一部分,或它們在.a文件中的位置。在鏈接時,他們被拉進exe文件,保持其原有的功能;他們在.a文件中的「臨時住所」並不影響他們如何找到共享內存段,他們如何確定相關的偏移量等。因此,如果這些(即密鑰和包裝函數)沒有改變,您應該設置。

+0

我應該澄清一點,我的主要擔心是在編譯/鏈接時,共享內存密鑰會轉換爲內存中的位置0x8000,如果我要使用相同的共享內存包裝函數(並因此使用密鑰)重新編譯可執行文件*共享內存位置可能會更改爲內存中的位置0xABCD,導致所有IPC崩潰。但是,將分配的內存塊抽象爲一個關鍵點似乎是爲了避免這種類型的行爲,並且從操作系統處理從鍵到邏輯內存位置的實際映射,這使我的擔心毫無根據。這聽起來正確嗎? – SiegeX 2010-01-20 06:22:00

+0

共享內存位置不是在編譯和鏈接時確定的,除非你要求一個特定的位置(例如通過'shmat()'的'shmaddr'參數或'mmap()的'addr'參數)' - 在這種情況下,如果發生更改,您可以在源代碼中看到)。如果你通過'NULL',操作系統在運行時決定(並且允許爲每次運行選擇一個不同的地址)。 – caf 2010-01-20 06:27:36

+0

SiegeX:這對我來說似乎是正確的(當然,後者)。如果有幫助的話,考慮到對於非共享內存的情況,int a的內存位置在每次運行時都可能不同,因爲可執行文件可能每次都加載到不同的內存位置,即使exe本身並沒有改變。共享內存(我假設)迄今爲止已經屏蔽了這一點,所以您可以推斷共享內存也可以保護您免受包裝函數和密鑰在可執行文件中移動的事實。 – BobS 2010-01-20 07:50:24