问题描述
与 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中编译运行。
-
blk_hdr_t
结构体虽然对齐了 4 个字节,总共 16 个字节:22 个字节 (更新:我发现此 solution 与 -mno-ms-bitfields 选项一起使用) - 虽然有 5100 个字节可用,但 read() 函数只能读取 1000 个字节。是什么阻碍了它进一步阅读?
- read() 还将带有“0x00”字节值的“洞”放入其中。我不明白这种奇怪的行为。
- 启用 lseek 跳过前 1024 个字节将到达文件末尾。
在 linux 结果上一切看起来都很完美(尽管第 3 点)在 linux 方面也确实存在:虽然这对我来说微不足道,但我对行为很好奇)
最后,如何在 windows gcc 上使用 精确结果 制作此代码,就像在 linux gcc 中一样? 任何人都可以请启发我吗? (结构体中的参数不能改组)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)