C Linux写入进程';在运行时拥有可执行文件

C Linux写入进程';在运行时拥有可执行文件,c,linux,runtime,executable,C,Linux,Runtime,Executable,我希望能够在可执行文件(C程序)的char数组中存储一些配置信息。我需要在运行时修改该数组的内容。 但我无法从进程中打开文件。 所以可能吗?如果可能的话,诀窍是什么? 非常感谢 [1] 问题是如何做,而不是这是个好主意吗 [2] 我想在运行时写入进程自己的EXEC,因为我很好奇如何做到这一点。让我们把它看作是一种黑客行为 写入可执行文件几乎肯定是错误的。这里最简单的方法是使用一个配置文件,并将其读入您的字符数组。既然您已经知道这是一个坏主意,我就不麻烦再说一遍了 您最好阅读一下可执行文件格式。该

我希望能够在可执行文件(C程序)的char数组中存储一些配置信息。我需要在运行时修改该数组的内容。 但我无法从进程中打开文件。 所以可能吗?如果可能的话,诀窍是什么? 非常感谢

[1] 问题是如何做,而不是这是个好主意吗


[2] 我想在运行时写入进程自己的EXEC,因为我很好奇如何做到这一点。让我们把它看作是一种黑客行为

写入可执行文件几乎肯定是错误的。这里最简单的方法是使用一个配置文件,并将其读入您的字符数组。

既然您已经知道这是一个坏主意,我就不麻烦再说一遍了

您最好阅读一下可执行文件格式。该文件可能是ELF格式,但您可以使用
file
命令检查它

通常,文件是在节中构建的,每个变量在节中都有一个偏移量。
nm
命令可以告诉您给定符号的截面和偏移量。
每个节从文件中给定的偏移量开始。我认为
objdump
命令可以找到这些偏移量

它不适用于BSS部分中的符号(未初始化的静态变量)-这些变量的值不存储在文件中-只是在加载时应该分配它们

一旦你有了这些偏移量,一切都很简单——添加、打开、查找、写入、关闭。

解决了。
使用fork()+execl()组合,我复制了一份可执行文件,对其进行修改,没有任何问题,然后使用fork+execl mv,我将原始可执行文件替换为修改后的可执行文件。

可执行文件位于磁盘上,而程序则加载在内存中。运行时,对文件磁盘版本的任何更改都不会影响正在运行的程序。另外,如果您在可执行文件中有一个数组,您可能是指像全局变量之类的东西?在这种情况下,您只需访问并更改它!谢谢没错,它是一个全局字符数组。问题是我的错误。我刚刚找到了带有“string-tx a.out”的数组偏移量,并在程序中对其进行了硬编码,应该是fseek()和fwrite()。但我甚至无法打开exec文件进行写入…不要这样做。改为使用ASCII配置文件。这样做的好处是,您可以拥有多个配置文件,并且当事情停止工作时,您可以轻松查看可执行文件正在使用的配置。我们的目标是写给执行者,我想……正如我所说的,获取文件中数组的偏移量与它在内存中的地址完全无关。谢谢你的回答。我只是好奇我该怎么做,因为我觉得在exec文件中存储变量配置信息的想法很有趣。这只是一个不寻常的机会,让我们有机会更多地了解linux。显然,在大多数情况下这是个坏主意,但我的目标是这样做。如果你对如何做到这一点有一些想法,请分享。谢谢。我已经找到了我需要的所有补偿。问题是我无法处理event fopen()进程的ELF文件,每次我尝试这样做时,它都返回NULL…我猜该文件无法打开,因为它已经被正在运行的进程打开以供读取。我不知道你是否可以覆盖它。按照描述在RHEL上工作-fork()子对象,system()复制、写入、替换-错误26的良好解决方法-“文本文件忙”。