windows和Linux gcc编译器之间奇怪的字节对齐

问题描述

与 linux gcc 编译器相比,我看到读取 bin 文件并映射到 windows 中的结构的奇怪行为。

下面是我的c代码:

#include <inttypes.h>
#include <stdio.h>
#include <fcntl.h>

#define IV_MAX_LEN              32
#define HASH_MAX_LEN            64
#define MAX_NUM_IMGS            8
#define MAX_NUM_SRK_RECORDS     4
#define SKIP_OFFSET_1K          0x400

typedef struct {
    uint8_t version;
    uint16_t length;
    uint8_t tag;
    uint16_t srk_table_offset;
    uint16_t cert_offset;
    uint16_t blob_offset;
    uint16_t signature_offset;
    uint32_t reserved;
} __attribute__((packed)) blk_hdr_t;

typedef struct {
    uint32_t offset;
    uint32_t size;
    uint64_t dst;
    uint64_t entry;
    uint32_t hab_flags;
    uint32_t meta;
    uint8_t hash[HASH_MAX_LEN];
    uint8_t iv[IV_MAX_LEN];
} __attribute__((packed)) boot_t;
typedef struct {
    uint8_t version;
    uint16_t length;
    uint8_t tag;
    uint32_t flags;
    uint16_t sw_version;
    uint8_t fuse_version;
    uint8_t num_images;
    uint16_t sig_blk_offset;
    uint16_t reserved;
    boot_t img[MAX_NUM_IMGS];
    blk_hdr_t blk_hdr;
    uint32_t sigblk_size;
    uint32_t padding;
} __attribute__((packed)) headerMain_t;

int main()
{
    int ofd =1;
    char filename[] = "sample.bin";
    int readSizes= 0;
    int headerSizes= 0;
    headerMain_t header;
    uint8_t *byte;

    ofd = open(filename,O_RDONLY);
    printf("\nOPENING File: %s!\n",filename);
    printf("\n STRUCT sizes: %d,%d,\n",sizeof(headerMain_t),sizeof(boot_t),sizeof(blk_hdr_t));
#if 0
    if(lseek(ofd,SKIP_OFFSET_1K,SEEK_SET) < 0) {
        printf("Error Read \n");
    }
#endif    
    readSizes = read(ofd,&header,sizeof(header)) ;
    headerSizes = sizeof(header);
    printf("\n Read SIZE: %d / %d !",readSizes,headerSizes);
    
    printf("\n Read Bytes: \n");
    byte = (uint8_t*)&header;
    for(int i=0; i<readSizes; i++)
    {
        printf("0x%02x,",*byte);
        byte++;
        if(0 ==i%20 )
            printf("\n");
    }
    
    return 0;
}

这是它读取的输入 binary file。 (这个示例 bin 文件是 0x01(20 次)... 0xFF(20 次) = 所以 255 x 20 = 5100 字节) 同样的代码在windows mingW-gcc和linux gcc中编译运行。

以下是在 Windows 运行中看到的奇怪观察结果:

enter image description here

  1. blk_hdr_t 结构体虽然对齐了 4 个字节,总共 16 个字节:22 个字节 (更新:我发现此 solution 与 -mno-ms-bitfields 选项一起使用)
  2. 虽然有 5100 个字节可用,但 read() 函数只能读取 1000 个字节。是什么阻碍了它进一步阅读?
  3. read() 还将带有“0x00”字节值的“洞”放入其中。我不明白这种奇怪的行为。
  4. 启用 lseek 跳过前 1024 个字节将到达文件末尾。

在 linux 结果上一切看起来都很完美(尽管第 3 点)在 linux 方面也确实存在:虽然这对我来说微不足道,但我对行为很好奇)

最后,如何在 windows gcc 上使用 精确结果 制作此代码,就像在 linux gcc 中一样? 任何人都可以请启发我吗? (结构体中的参数不能改组)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...