代码之家  ›  专栏  ›  技术社区  ›  Trey

我真的可以用8位地址来映射ELF文件吗?

  •  1
  • Trey  · 技术社区  · 5 年前

    所以我试图解析一个可执行文件,并判断它是否是ELF文件,下面是我所做的:

        uint64_t *mapped_file = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
    
        if (mapped_file[0] != 0x7f || strcmp(&mapped_file[1], "ELF"))
        {
            fprintf(stderr, "%s is not an ELF file\n", argv[1]);
            exit(EXIT_FAILURE);
        }
    

    因为我在一台64位的机器上,我想 uint64\

    1 回复  |  直到 5 年前
        1
  •  3
  •   phuclv    5 年前

    指针的大小对于机器来说总是正确的。例如,在64位机器上,指针大小将为64位。它指向什么完全取决于你。因为您将其视为字节数组,所以正确的做法是使用指向8位数据的指针,即。 uint8_t *mapped_file . 这不是8位指针,而是指向8位数据数组的指针(本例中为64位)。

    strcmp 将使用以0结尾的字符串。除非“ELF”后面的字节是零,否则将失败。而是使用 strncmp 您可以指定比较的长度限制为3字节。

    代码失败的原因是指定了一个64位值的数组。所以在比较中 mapped_file[0] != 0x7f &mapped_file[1] 实际上是从第9个字节开始,而不是第2个字节。