rdf2bin.c
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* rdf2bin: convert an RDOFF object file to flat binary */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "rdfload.h"
  6. #include "rdoff.h"
  7. #include "nasmlib.h"
  8. long origin = 0;
  9. int align = 16;
  10. char *getfilename(char * pathname)
  11. {
  12.     char * lastslash = pathname - 1;
  13.     char * i = pathname;
  14.     while ( *i ) {
  15. if (*i == '/') lastslash = i;
  16. i++;
  17.     }
  18.     return lastslash + 1;
  19. }
  20. int main(int argc, char **argv)
  21. {
  22.     rdfmodule  * m;
  23.     int  tmp;
  24.     FILE  *of;
  25.     char  * padding;
  26.     int  codepad, datapad;
  27.     if (argc < 2) {
  28. puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] "
  29.      "input-file  output-file");
  30. puts("       rdf2com [-p segment-alignment] input-file output-file");
  31. return 1;
  32.     }
  33.     if (! nasm_stricmp(getfilename(*argv),"rdf2com")) {
  34. origin = 0x100;
  35.     }
  36.     argv++, argc--;
  37.     while (argc > 2) {
  38. if (! strcmp(*argv,"-o")) {
  39.     argv++, argc--;
  40.     origin = readnum(*argv, &tmp);
  41.     if (tmp) {
  42. fprintf(stderr,"rdf2bin: invalid parameter: %sn",*argv);
  43. return 1;
  44.     }
  45. } else if (! strcmp(*argv,"-p")) {
  46.     argv++, argc--;
  47.     align = readnum(*argv, &tmp);
  48.     if (tmp) {
  49. fprintf(stderr,"rdf2bin: invalid parameter: %sn",*argv);
  50. return 1;
  51.     }
  52. } else 
  53.     break;
  54. argv++, argc--;
  55.     }
  56.     if (argc < 2) {
  57. puts("rdf2bin: required parameter missing");
  58. return -1;
  59.     }
  60.     m = rdfload(*argv);
  61.     if (! m)
  62.     {
  63. rdfperror("rdf2bin",*argv);
  64. return 1;
  65.     }
  66.     printf("relocating %s: origin=%lx, align=%dn",*argv,origin,align);
  67.     m->textrel = origin;
  68.     m->datarel = origin + m->f.code_len;
  69.     if (m->datarel % align != 0) {
  70. codepad = align - (m->datarel % align);
  71. m->datarel += codepad;
  72.     }
  73.     else
  74. codepad = 0;
  75.     m->bssrel = m->datarel + m->f.data_len;
  76.     if (m->bssrel % align != 0) {
  77. datapad = align - (m->bssrel % align);
  78. m->bssrel += datapad;
  79.     }
  80.     else
  81. datapad = 0;
  82.     printf("code: %08lxndata: %08lxnbss:  %08lxn",
  83.    m->textrel, m->datarel, m->bssrel);
  84.     rdf_relocate(m);
  85.     argv++;
  86.     of = fopen(*argv,"wb");
  87.     if (!of) {
  88. fprintf(stderr,"rdf2bin: could not open output file %sn",*argv);
  89. return 1;
  90.     }
  91.     padding = malloc(align);
  92.     if (!padding) {
  93. fprintf(stderr,"rdf2bin: out of memoryn");
  94. return 1;
  95.     }
  96.     if (fwrite(m->t,1,m->f.code_len,of) != m->f.code_len ||
  97. fwrite(padding,1,codepad,of) != codepad ||
  98. fwrite(m->d,1,m->f.data_len,of) != m->f.data_len) 
  99.     {
  100. fprintf(stderr,"rdf2bin: error writing to %sn", *argv);
  101. return 1;
  102.     }
  103.     fclose(of);
  104.     return 0;
  105. }