2013-02-06 23 views
-2

我希望能夠在可執行文件(C程序)內的char數組中存儲一些配置信息。我需要在運行時修改該數組的內容。 但我無法打開該進程中的文件。 所以......有可能,如果是 - 有什麼竅門? 非常感謝提前。Linux在運行時寫入處理自己的可執行文件

[1]問題是如何去做和不是這是一個好主意嗎?

[2]我想在運行時寫入處理'自己的EXEC只是因爲我很好奇如何做到這一點。讓我們把它看成是一種黑客行爲。

+4

當您的程序加載到內存中時,可執行文件在磁盤上。在運行時,對文件磁盤版本的任何更改都不會影響正在運行的程序。另外,如果你在可執行文件中有一個數組,你可能意味着像一個全局變量或其他東西?在這種情況下,您只需訪問並更改它! – Shahbaz

+0

謝謝!沒錯,它是一個全局char數組。問題是我得到的段錯誤。我剛剛發現數組偏移量爲「string -tx a.out」並將其硬編碼到程序中,我應該使用fseek()和fwrite()。但是我甚至無法打開exec文件來寫... – 4mp3R

+0

不要這樣做。改爲使用ASCII配置文件。這樣做的好處是您可以擁有多個配置文件,並且可以讓您在停止工作時輕鬆查看可執行文件正在使用的配置 –

回答

0

寫入可執行文件幾乎肯定是錯誤的。這裏最簡單的事情是使用一個配置文件,並從中讀取到你的char數組中。

+1

謝謝你的答案。我只是好奇,我該怎麼做,因爲我發現在exec文件中存儲變量配置信息的想法相當有趣。這只是一些不尋常的和有機會學習更多關於Linux的東西。顯然,在大多數情況下這是一個壞主意,但我的目標是這樣做。如果您對如何完成該操作有一些想法,請分享它們。 – 4mp3R

0

既然你已經知道這是一個壞主意,我不會再打擾你了。

你最好做一些關於可執行文件格式的閱讀。該文件可能採用ELF格式,但您可以使用file命令進行檢查。

通常情況下,文件是按部分構建的,並且每個變量在部分中都有一個偏移量。
nm命令可以告訴您給定符號的段和偏移量。
每個部分從文件中的給定偏移量開始。我認爲objdump命令可以找到這些偏移量。

它不適用於BSS部分中的符號(未初始化的靜態變量) - 它們的值不存儲在文件中 - 只是在加載時應該分配它們。

一旦你有這些偏移量,一切都很簡單 - 添加它們,打開,尋找,寫,關閉。

+0

謝謝。我已經找到了我需要的所有偏移量。問題是我不能事件fopen()進程'ELF文件,每次我嘗試去做它都會返回NULL ... – 4mp3R

+0

我猜這個文件無法打開,因爲它已經被打開供運行進程讀取。我不知道你是否可以重寫它。 – ugoren

+0

對...我想我需要找到一種方法來關閉它... – 4mp3R

0

已解決。使用fork()+ execl()組合我製作了可執行文件的副本,並且沒有任何問題進行修改,然後用fork + execl mv將原始可執行文件替換爲修改過的可執行文件。

相關問題