在 运行 程序中写入可执行文件

Writing in the executable while running the program

我正在编写一个 C 程序,我希望能够将数据存储在可执行文件中。 我尝试制作一个函数在文件末尾写入一个字节,但它看起来无法打开文件,因为它到达 printf 然后给出“分段错误”。

void writeByte(char c){

    FILE *f;
    f = fopen("game","wb");

    if(f == 0)
        printf("\nFile not found\n");

    fseek(f,-1,SEEK_END);
    fwrite(&c,1,sizeof(char),f);

    fclose(f);

}

文件在正确的目录中并且名称正确。当我尝试读取最后一个字节而不是写入时,它可以正常工作。

编辑:我知道我应该中止程序而不是尝试写入,但我的主要问题是程序无法打开文件,尽管它位于同一目录中。

您的代码中有几个不相关的问题和您要解决的问题。

首先您缺乏适当的错误处理。如果任何可能失败的函数(例如 fopen)失败,您应该采取相应的措施。例如,如果你做了

#include <error.h>
#include <errno.h>
...
f = fopen("game","wb");
if ( f == NULL ) {
    error(1,errno,"File could not be opened");
}
...

您会收到一条有用的错误消息,例如

./game: File could not be opened: Text file busy

您打印了一条消息,该消息甚至不正确(无法打开的文件与未找到的文件有所不同)并继续执行导致分段错误的程序,因为您取消引用 NULL 指针在 fopen.

失败后存储在 f

Second 正如消息告诉我们的(至少在我的 linux 机器上),文件正忙。这意味着,我的操作系统不允许我以写入模式打开我 运行ning 中的可执行文件。 this 问题的答案列出了此错误消息解释的众多来源。可能有办法解决这个问题并以写入模式打开 运行ning 可执行文件,但我怀疑这是否容易,我怀疑这是否会解决您的问题,因为:...

第三 可执行文件以特殊的二进制格式存储(通常是Linux上的ELF)。它们不是为手动修改而设计的。我不知道如果你只是向它附加数据会发生什么,但如果你不小心并且知道你在做什么,你可能 运行 会遇到严重的问题。

如果您只是想存储数据,请使用另一个普通的新文件。如果您希望将代码附加到可执行文件,您真的应该在继续之前收集一些关于 ELF 文件的背景信息(例如来自 man elf)。