2013-02-06 21 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将原始可执行文件替换为修改过的可执行文件。

相关问题