Xcv.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. *
  6. */
  7. /*
  8. * Convert SUN-3 object format to ACK object format. Only on Sun-3
  9. */
  10. #include <stdio.h>
  11. #include <out.h>
  12. #include <a.out.h>
  13. /*
  14. * Header and section table of new format object file.
  15. */
  16. struct outhead outhead;
  17. struct outsect outsect[4];
  18. #define TEXTSG 0
  19. #define ROMSG 1
  20. #define DATASG 2
  21. #define BSSSG 3
  22. char *output_file;
  23. char *program ;
  24. char flag ;
  25. #define readf(a, b, c) fread((a), (b), (int)(c), input)
  26. /* Output file definitions and such */
  27. struct exec bh;
  28. FILE *input;
  29. struct outname *oname = 0;
  30. char *strings = 0;
  31. char *txt = 0;
  32. char *data = 0;
  33. unsigned nstrings;
  34. main(argc, argv)
  35. int argc;
  36. char *argv[];
  37. {
  38. register struct outsect *p;
  39. char *malloc();
  40. input = stdin;
  41. program= argv[0] ;
  42. if ( argc>1 && argv[1][0]=='-' ) {
  43. flag=argv[1][1] ;
  44. argc-- ; argv++ ;
  45. }
  46. switch (argc) {
  47. case 3: if (! wr_open(argv[2]))
  48. fatal("Can't write %s.\n", argv[2]);
  49. output_file = argv[2];
  50. if ((input = fopen(argv[1], "r")) == (FILE *)0)
  51. fatal("Can't read %s.\n", argv[1]);
  52. break;
  53. default:fatal("Usage: %s <Sun-3 object> <ACK object>.\n", argv[0]);
  54. }
  55. if (! readf(&bh, sizeof(struct exec), 1)) rd_fatal();
  56. if (N_BADMAG(bh)) fatal("bad magic number\n");
  57. outhead.oh_magic = O_MAGIC;
  58. outhead.oh_stamp = 0;
  59. outhead.oh_nsect = 4;
  60. outhead.oh_nname = 3 + bh.a_syms / sizeof(struct nlist);
  61. outhead.oh_nrelo = (bh.a_trsize + bh.a_drsize) / sizeof(struct reloc_info_68k);
  62. outhead.oh_flags = outhead.oh_nrelo ? HF_LINK : 0;
  63. outhead.oh_nemit = bh.a_text + bh.a_data - (bh.a_magic == ZMAGIC ? sizeof(struct exec) : 0);
  64. fseek(input, N_STROFF(bh), 0);
  65. nstrings = getw(input);
  66. strings = malloc(nstrings + 20);
  67. oname = (struct outname *)
  68. malloc((unsigned) (3 + bh.a_syms / sizeof(struct nlist)) * sizeof (struct outname));
  69. txt = malloc(bh.a_text);
  70. data = malloc(bh.a_data);
  71. if (!strings || !oname || !txt || !data) {
  72. fatal("No memory\n");
  73. }
  74. if (! readf(strings, nstrings, 1)) rd_fatal();
  75. p = &outsect[TEXTSG];
  76. p->os_base = N_TXTADDR(bh); p->os_size = p->os_flen = bh.a_text;
  77. if (bh.a_magic == ZMAGIC) {
  78. p->os_base += sizeof(struct exec);
  79. p->os_size -= sizeof(struct exec);
  80. p->os_flen -= sizeof(struct exec);
  81. p->os_foff = OFF_EMIT(outhead); p->os_lign = 1;
  82. }
  83. p = &outsect[ROMSG];
  84. p->os_base = (p-1)->os_base + (p-1)->os_size;
  85. p->os_size = p->os_flen = 0;
  86. p->os_foff = OFF_EMIT(outhead) + bh.a_text; p->os_lign = 1;
  87. p = &outsect[DATASG];
  88. p->os_base = N_DATADDR(bh); p->os_size = p->os_flen = bh.a_data;
  89. p->os_foff = OFF_EMIT(outhead) + (p-2)->os_flen;
  90. p->os_lign = bh.a_magic == ZMAGIC ? 0x20000 : 1;
  91. p = &outsect[BSSSG];
  92. p->os_base = N_BSSADDR(bh);
  93. p->os_flen = 0; p->os_size = bh.a_bss;
  94. p->os_foff = OFF_EMIT(outhead)+(p-1)->os_foff + (p-1)->os_flen;
  95. p->os_lign = 1;
  96. if (bh.a_magic == ZMAGIC) bh.a_text -= sizeof(struct exec);
  97. fseek(input, sizeof(struct exec), 0);
  98. if (bh.a_text && ! readf(txt, 1, bh.a_text)) rd_fatal();
  99. if (bh.a_data && ! readf(data, 1, bh.a_data)) rd_fatal();
  100. symtab(oname, strings);
  101. wr_ohead(&outhead);
  102. wr_sect(outsect, 4);
  103. wr_outsect(TEXTSG);
  104. wr_emit(txt, bh.a_text);
  105. wr_outsect(DATASG);
  106. wr_emit(data,bh.a_data);
  107. wr_name(oname, outhead.oh_nname);
  108. wr_string(strings, outhead.oh_nchar);
  109. wr_close();
  110. exit(0);
  111. }
  112. symtab(name, string)
  113. struct outname *name;
  114. char *string;
  115. {
  116. register struct outname *oname = name;
  117. register char *strings = string+nstrings;
  118. register int c;
  119. register char *b;
  120. struct nlist n;
  121. oname->on_valu = 0; oname->on_foff = strings - string + OFF_CHAR(outhead); oname->on_desc = 0;
  122. oname->on_type = (S_MIN+TEXTSG) | S_SCT;
  123. b = ".text"; while (*strings++ = *b) b++;
  124. oname++;
  125. oname->on_valu = 0; oname->on_foff = strings - string + OFF_CHAR(outhead); oname->on_desc = 0;
  126. oname->on_type = (S_MIN+DATASG) | S_SCT;
  127. b = ".data"; while (*strings++ = *b) b++;
  128. oname++;
  129. oname->on_valu = 0; oname->on_foff = strings - string + OFF_CHAR(outhead); oname->on_desc = 0;
  130. oname->on_type = (S_MIN+BSSSG) | S_SCT;
  131. b = ".bss"; while (*strings++ = *b) b++;
  132. oname++;
  133. outhead.oh_nchar = strings - string;
  134. while (bh.a_syms > 0) {
  135. if (! readf(&n, sizeof(struct nlist), 1)) rd_fatal();
  136. bh.a_syms -= sizeof(struct nlist);
  137. oname->on_desc = n.n_desc;
  138. if (n.n_un.n_strx - 4 < 0) oname->on_foff = 0;
  139. else oname->on_foff = OFF_CHAR(outhead) - 4 + n.n_un.n_strx;
  140. oname->on_valu = n.n_value;
  141. if (n.n_type & N_STAB) {
  142. oname->on_type = n.n_type << 8;
  143. oname++;
  144. continue;
  145. }
  146. switch(n.n_type & ~N_EXT) {
  147. case N_ABS:
  148. oname->on_type = S_ABS;
  149. break;
  150. case N_TEXT:
  151. oname->on_type = S_MIN + TEXTSG;
  152. break;
  153. case N_DATA:
  154. oname->on_type = S_MIN + DATASG;
  155. oname->on_valu -= bh.a_text;
  156. break;
  157. case N_BSS:
  158. oname->on_type = S_MIN + BSSSG;
  159. oname->on_valu -= bh.a_text + bh.a_data;
  160. break;
  161. case N_UNDF:
  162. if (! oname->on_valu) {
  163. oname->on_type = S_UND;
  164. break;
  165. }
  166. oname->on_type = (S_MIN + BSSSG) | S_COM;
  167. break;
  168. case N_FN:
  169. oname->on_type = S_FIL;
  170. break;
  171. default:
  172. fatal("Illegal type field %d in namelist\n", c);
  173. }
  174. if (n.n_type & N_EXT) oname->on_type |= S_EXT;
  175. oname++;
  176. }
  177. }
  178. /* VARARGS1 */
  179. fatal(s, a1, a2)
  180. char *s;
  181. {
  182. fprintf(stderr,"%s: ",program) ;
  183. fprintf(stderr, s, a1, a2);
  184. unlink(output_file);
  185. exit(-1);
  186. }
  187. wr_fatal() { fatal("Write error\n"); }
  188. rd_fatal() { fatal("Read error\n"); }