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

时间:2018-11-01 00:19:58

标签: c x86-64 elf

所以我试图解析一个可执行文件,并告诉它是否是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_t 是mmap返回值的合适类型,但是当我这样做时,strcmp会失败。我设法改用uint8_t解决了​​这个问题,但是我不确定这是否有效。如果我在8位变量中存储64位地址,会有任何问题吗?

1 个答案:

答案 0 :(得分:3)

指针始终是机器的正确大小。例如。在64位计算机上,指针大小将为64位。它所指的完全取决于您。因为您将其视为字节数组,所以正确的方法是使用指向8位数据的指针,即uint8_t *mapped_file。这不是8位指针,而是指向8位数据数组的指针(在您的情况下为64位)。

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

代码失败的原因是因为您要指定64位值的数组。因此,在比较mapped_file[0] != 0x7f中,您实际上是将64bit(文件的前8个字节)值与0x7f进行比较。同样,您在&mapped_file[1]处的偏移量实际上将从第9个字节开始,而不是第2个字节。