mksimage.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.mksimage.c 1.7 10/11/01 11:59:05 trini
  3.  */
  4. /*
  5.  *
  6.  *
  7.  *
  8.  *
  9.  */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include <stdarg.h>
  14. #include <sys/types.h>
  15. #include <fcntl.h>
  16. #include <unistd.h>
  17. #include <errno.h>
  18. #define SIZE 1024
  19. #define BLOCK_ALIGN(x)  (((x)+SIZE-1)&(~(SIZE-1)))
  20. static void
  21. die(const char *fmt, ...)
  22. {
  23. va_list args;
  24. va_start(args, fmt);
  25. vfprintf(stderr, fmt, args);
  26. fputc('n', stderr);
  27. exit(1);
  28. }
  29. static void
  30. usage(void)
  31. {
  32. printf("Usage: mkbinimg <bootstrap> <kernel> <ramdisk> -o <binary>n");
  33. exit(1);
  34. }
  35. static int
  36. copy_blocks(int ifd, int ofd, unsigned long *offset, unsigned long *size)
  37. {
  38. off_t cur;
  39. int amt;
  40. unsigned long len = 0;
  41. char buffer[SIZE];
  42. cur = lseek(ofd, 0, SEEK_CUR);
  43. if (cur % SIZE) {
  44. cur = BLOCK_ALIGN(cur);
  45. cur = lseek(ofd, cur, SEEK_SET);
  46. }
  47. *offset = (unsigned long) cur;
  48. while((amt = read(ifd, buffer, SIZE)) > 0) {
  49. write(ofd, buffer, amt);
  50. len += amt;
  51. }
  52. *size = len;
  53. return 0;
  54. }
  55. int
  56. main(int argc, char *argv[])
  57. {
  58. char *kernel, *loader, *rdimage = NULL;
  59. unsigned long ld_off, kern_off, rd_off;
  60. unsigned long ld_size, kern_size, rd_size;
  61. int fd, ofd, len;
  62. char buffer[500];
  63. if (argc < 5 && !strcmp(argv[argc-2], "-o"))
  64. usage();
  65. if (argc > 5)
  66. rdimage = argv[3];
  67. kernel = argv[2];
  68. loader = argv[1];
  69. ofd = open(argv[argc-1], (O_RDWR|O_CREAT), 0755);
  70. if (ofd < 0) {
  71. die("can't open %s: %s", argv[5], strerror(errno));
  72. }
  73. ld_off = kern_off = rd_off = 0;
  74. ld_size = kern_size = rd_size = 0;
  75. memset(buffer, 0, 500);
  76. len = 0;
  77. fd = open(loader, O_RDONLY);
  78. if (fd < 0) 
  79. die("can't open loader: %s", strerror(errno));
  80. copy_blocks(fd, ofd, &ld_off, &ld_size);
  81. len = sprintf(buffer, "bootloader: %lx %lxn", ld_off, ld_size);
  82. close(fd);
  83. fd = open(kernel, O_RDONLY);
  84. if (fd < 0)
  85. die("can't open kernel: %s", strerror(errno));
  86. copy_blocks(fd, ofd, &kern_off, &kern_size);
  87. len += sprintf(buffer+len, "zimage: %lx %lxn", kern_off, kern_size);
  88. close(fd);
  89. if (rdimage) {
  90. fd = open(rdimage, O_RDONLY);
  91. if (fd < 0)
  92. die("can't get ramdisk: %s", strerror(errno));
  93. copy_blocks(fd, ofd, &rd_off, &rd_size);
  94. close(fd);
  95. }
  96. len += sprintf(buffer+len, "initrd: %lx %lx", rd_off, rd_size);
  97. close(ofd);
  98. printf("%sn", buffer);
  99. return 0;
  100. }