現在、ツールを作っていて、問題が発生しました。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/sysmacros.h> #include <unistd.h> #include <fcntl.h> #include <linux/config.h> #include <linux/a.out.h> #define MINIX_HEADER 32 #define GCC_HEADER 1024 #define SYS_SIZE DEF_SYSSIZE #define DEFAULT_MAJOR_ROOT 0 #define DEFAULT_MINOR_ROOT 0 #define SETUP_SECTS 4 #define STRINGIFY(x) #x typedef union{ long l; short s[2]; char b[4]; }conv; long intel_long(long l) { conv t; t.b[0] = l & 0xff; l >>= 8; t.b[1] = l & 0xff; l >>= 8; t.b[2] = l & 0xff; l >>= 8; t.b[3] = l & 0xff; l >>= 8; return t.l; } short intel_short(short l) { conv t; t.b[0] = l & 0xff; l >>= 8; t.b[1] = l & 0xff; l >>= 8; return t.s[0]; } void die(char *str) { fprintf(stderr, "%s\n", str); exit(1); } void usage(void) { die("Usage: build bootsect setup system [rootdev] [> image]"); } int main(int argc, char **argv) { int i, id; char buf[1024]; char major_root, minor_root; struct stat sb; if((argc < 4) || (argc > 5)) usage(); if(argc > 4){ if(!strcmp(argv[4], "CURRENT")){ if(stat("/", &sb)){ perror("/"); die("Couldn't stat /"); } major_root = major(sb.st_dev); minor_root = minor(sb.st_dev); }else if(strcmp(argv[4], "FLOPPY")){ if(stat(argv[4], &sb)){ perror(argv[4]); die("Couldn't stat root device."); } major_root = major(sb.st_rdev); minor_root = minor(sb.st_rdev); }else major_root = minor_root = 0; }else{ major_root = DEFAULT_MAJOR_ROOT; minor_root = DEFAULT_MINOR_ROOT; } fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root); for(i = 0; i < sizeof(buf); i++) buf[i] = 0; if((id = open(argv[1], O_RDONLY, 0)) < 0) die("Unable to open 'boot'"); if(read(id, buf, MINIX_HEADER) != MINIX_HEADER) die("Unable to read header of 'boot'"); fprintf(stderr, "[debug]:%lX\n", ((long *)buf)[0]); if(((long *)buf)[0] != intel_long(0x4100301)) die("Non-Minix header of 'boot'"); if(((long *)buf)[1] != intel_long(MINIX_HEADER)) die("Non-Minix header of 'boot'"); if(((long *)buf)[3] != 0) die("Illegal data segment in 'boot'"); if(((long *)buf)[4] != 0) die("Illegal bss in 'boot'"); if(((long *)buf)[5] != 0) die("Non-Minix header of 'boot'"); if(((long *)buf)[7] != 0) die("Illegal symbol table in 'boot'"); i = read(id, buf, sizeof(buf)); fprintf(stderr, "Boot sector %d bytes.\n", i); if(i != 512) die("Boot block must be exactly 512 bytes"); if((*(unsigned short *)(buf + 510)) != (unsigned short)intel_short(0xAA55)) die("Boot block hasn't got boot flag (0xAA55)"); buf[508] = (char)minor_root; buf[509] = (char)major_root; i = write(1, buf, 512); if(i != 512) die("Write call failed"); close(id); return 0; }
これで、a.outファイルを読み込むと、期待では
[debug]:4100301
と表示され、正常に終了するのですが、エラーで
[debug]:2004100301
と表示されてしまいます。
なぜ、該当の文で4100301と表示されないのでしょうか。
また、なぜlong型にキャストしているはずなのに
5バイト読み込まれているのでしょうか。
環境は、
Windows 10, Ubuntu 7.5.0 gcc 7.5.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/01 11:43