2015-06-11 45 views
0

首先,我想問一下,應用程序是否可以在運行時在同一地址空間更新自身? 如果是,那麼實現邏輯的最好方法是什麼? 用例:我的應用程序正在連接到網絡的主板上運行。在運行時,如果它檢測到同一個應用程序的新版本,那麼如何在同一個內存地址上更新應用程序,在那裏存儲以前的地址。 根據我的理解,首先我們應該採取更新的備份,並在啓動加載時,主應用程序應該更新備份,然後正常啓動應用程序。我對嗎?C應用程序如何在運行時在Linux環境中自行更新

+1

你能更好的解釋一下嗎?也許用一個例子用例 –

回答

1

通常,您可以在運行時更換包含可執行文件的文件,而不會出現問題。

您更新文件後,您可以像往常一樣啓動應用程序,並關閉正在運行的實例。

不過,若你想在運行時做到這一點(即不分叉或啓動新的進程),我不認爲這是可能的,而不怪異無比黑客:

  • 如果您計劃「變基」程序內存與新的可執行代碼,你需要爲每個線程計算堆棧,內存和指令指針。你需要成爲一名反彙編人員。
  • 如果你計劃加載到內存若干輔助後段調用程序中的一個存根,這很好,但你要到哪目標函數是,如果它在你的下一次更新的消失,會發生什麼。另外它完全是平臺特定的。
  • 如果您計劃通過使用動態加載和卸載共享庫,以規範上述辦法,我看不出有任何問題 - 這是非常相似的地方重新啓動整個過程的方法。

我會去替換隻是可執行文件,或第三個選項,如果我有一個很好的理由。最後一個選項是好的,因爲它可以讓你單獨更新您的應用程序的組件(但在同一時間,這可能以後會導致你的維護問題。)

0

你需要的是一個類似於引導程序。在這種情況下:您將在設備上擁有兩個程序,以下稱爲加載程序和應用程序。

您的初始安裝系統:寫的應用程序的內存開始和Loader某處進一步下跌給空間,如果該應用程序的大小增長的未來。 (請注意裝載機的開始存儲器地址)

應用程序將正常運行,如果它是唯一的方案,定期檢查更新自己。如果在網絡上發現更新,請使用GOTO轉到Loader的第一個內存位置,然後該Loader將開始運行,並可以使用網絡上找到的新應用程序覆蓋原始應用程序。在加載程序結束時,GOTO返回(新的)應用程序。

看到這個堆棧溢出問題的想法如何轉到特定的內存地址。 Goto a specific Address in C

相關問題