【问题标题】:Writing in the executable while running the program在运行程序时写入可执行文件
【发布时间】:2022-01-25 13:51:06
【问题描述】:

我正在编写一个 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);

}

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

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

【问题讨论】:

  • 如果您发现文件无法打开,您应该中止程序而不是尝试访问该文件。
  • 当您尝试编写程序时,您的程序的确切输出是什么?
  • 你最好把你想得到的输出呈现出来,以便别人更好地理解并帮助你!
  • 还有什么文件需要打开?它是文本文件还是其他?也许您需要添加 .txt 或其他任何内容。 linux.die.net/man/3/fopen

标签: c linux file byte


【解决方案1】:

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

首先您缺乏适当的错误处理。如果任何可能失败的功能(例如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 指针在f 失败后fopen

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

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

如果您只是尝试存储数据,请使用另一个简单且新鲜的文件。如果您希望将代码附加到可执行文件中,您确实应该在继续之前收集一些有关 ELF 文件的背景信息(例如来自 man elf)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2016-09-15
    • 2010-12-21
    • 2011-09-08
    相关资源
    最近更新 更多