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

can I really use an 8-bit address to map an ELF file?

所以我试图解析一个可执行文件并判断它是否是一个 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 的 return 值的合适类型,但是当我这样做 strcmp 失败了。我设法通过使用 uint8_t 来解决这个问题,但我不确定这是一种有效的方法。如果将64位地址存储在8位变量中,会不会有问题?

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

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

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