2012-01-03 53 views
1

我有一個編譯和運行腳本的程序。將數據追加到可執行文件(Windows,Unix)

要創建一個獨立版本的腳本,我保留一個大的靜態緩衝區來保存編譯的腳本。編譯後的腳本被複制到程序的副本中,然後可以從該副本運行。

這工作正常。它也有一些缺點但是:

  • 緩衝區是靜態的,佔用空間,如果有一個在它沒有編譯 程序。
  • 如果要包含的腳本超出了緩衝區的大小,我需要用更大的緩衝區構建新版本。

我想將編譯的腳本添加到程序的末尾,但是這樣做不會像exe加載程序在新的文件大小時產生阻塞一樣工作。

有沒有一種方法來操縱exe,所以它是可以接受的裝載機(介意這是一個跨平臺的程序)?

+1

您可以查看7-zip等程序如何創建自解壓檔案。也許你可以使用類似的方法來嵌入你的腳本? – 2012-01-03 10:09:43

+0

我想你想在沒有重新編譯解釋器的情況下合併編譯的腳本,對嗎?否則,你將能夠通過修改你的構建系統來處理這個問題...... – thkala 2012-01-03 10:53:10

+0

上面的兩位評論者都指出了這一點。但是,我似乎無法找到壓縮程序如何執行此操作的任何示例。我希望能找到一些實用的源代碼,爲我節省了檢查可執行映像的麻煩。 – Tink 2012-01-03 15:57:42

回答

0

對於加載程序是可以接受的(介意這是一個跨平臺程序)?

我認爲這是不可能的,如果沒有平臺的具體情況。時間與不同實現的通用接口(所以保存/加載腳本的代碼很常見,但可執行操作是特定的)。

在Windows上,您將遇到正在運行的可執行文件被鎖定而無法修改的問題。通過在副本上工作,這可以被解決(但是以完全確定的方式重新命名的唯一方法是在引導時執行移動,但安排作業可能是可接受的)。

在Windows上,將數據添加到圖像(可執行文件或DLL)的最簡單方法是使用資源。定義自定義資源類型並添加到圖像中(UpdateResource函數),稍後使用LoadResource進行檢索。

+0

對於unix/linux,您可以使用objcopy將文件添加到文件中,然後使用libelf(假設爲ELF環境)讀取它們。 Mac使用不同的文件格式(並假設您正在構建.app實體,您可以將它們添加到二進制文件的資源部分並以這種方式使用它們。 – Petesh 2012-01-03 13:56:30

0

你說「腳本」,所以我想你有一個單獨的文件包含腳本(一個文本文件?)。您可以編寫一個簡單的程序來讀取腳本文件並將其轉換爲可編譯的格式(例如包含字節數組的初始化的C源代碼)。還有一些工具可用於將任意文件轉換爲可鏈接對象(.o或.obj)。在過去,我使用了GNU bimutils的命令「objcopy」。特別是,在Linux上:

objcopy -I binary -O elf32-i386 mydata mydata.o 

此命令創建一個對象,你可以用它來找到啓動,結束和數據塊的大小三公符號:

_binary_mydata_start _binary_mydata_end _binary_mydata_size

只要您安裝Windows版本的GNU binutils(例如cygwin),類似的東西也可以在Windows上使用。