Ignore:
Timestamp:
May 26, 2003, 4:43:12 PM (22 years ago)
Author:
zap
Message:

See ChangeLog.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/src/emxomf/emxaout.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r235 r236  
    2828#include <sys/param.h>
    2929#include <sys/emxload.h>
     30#include <sys/omflib.h>
    3031#include <ar.h>
     32#include <a_out.h>
    3133
    3234#define GROW_DEF_STATIC(NAME,TYPE) \
     
    4244  (grow_by (&NAME##_grow, 1), NAME##_grow.count++)
    4345
    44 /* The version number of this program.  This is printed with the usage
    45    message. */
    46 
    47 #define VERSION "0.9d"
    48 #include "../../../../include/innotekversion.h"
    49 
    5046/* Insert private header files. */
    5147
     
    150146GROW_DEF_STATIC (extdefs, struct extdef);
    151147GROW_DEF_STATIC (symbols, struct symbol);
    152 GROW_DEF_STATIC (trelocs, struct reloc);
    153 GROW_DEF_STATIC (drelocs, struct reloc);
     148GROW_DEF_STATIC (trelocs, struct relocation_info);
     149GROW_DEF_STATIC (drelocs, struct relocation_info);
    154150
    155151
     
    212208{
    213209  void *p;
    214 
     210 
    215211  p = malloc (n);
    216212  if (p == NULL && n != 0)
     
    227223{
    228224  void *p;
    229 
     225 
    230226  p = realloc (ptr, n);
    231227  if (p == NULL)
     
    242238{
    243239  char *p;
    244 
     240 
    245241  p = xmalloc (strlen (s) + 1);
    246242  strcpy (p, s);
     
    268264static void usage (void)
    269265{
    270   puts ("emxaout " VERSION INNOTEK_VERSION " -- Copyright (c) 1994-1996 by Eberhard Mattes\n");
     266  puts ("emxaout " VERSION " -- Copyright (c) 1994-1996 by Eberhard Mattes\n");
    271267  puts ("Usage:");
    272268  puts ("  emxaout [-u] [-o <output_file>] <input_file>");
     
    706702   ³n   External name
    707703   ³1-2 Type index
    708    À
     704   À 
    709705
    710706   Symbol indices are assigned sequentially by EXTDEF and COMDEF. */
     
    936932    F (bit 7)           1=frame thread, 0=methods F0 through F5
    937933    Frame (bits 4-6)    frame thread number (F=1) or frame method (F=0)
    938     T (bit 3)           1=target thread, 1=methods
     934    T (bit 3)           1=target thread, 1=methods 
    939935    P (bit 2)           Bit 2 of target method
    940936    Targt (bits 0-1)    target thread number (T=1) or target method (T=0) */
     
    945941  int frame_method, frame_index, target_method, target_index;
    946942  dword disp;
    947   struct reloc r;
     943  struct relocation_info r;
    948944  struct thread th;
    949945
     
    958954          fix_data = get_byte ();
    959955          if (first & 0x40)
    960             r.pcrel = 0;
     956            r.r_pcrel = 0;
    961957          else
    962             r.pcrel = 1;
    963           r.address = offset + cur_off;
    964           r.unused = 0;
     958            r.r_pcrel = 1;
     959          r.r_address = offset + cur_off;
     960          r.r_pad = 0;
    965961          locat = (first >> 2) & 0x0f;
    966962          if (fix_data & 0x80)
     
    10151011                  error2 ("FIXUPP: OFFSET-16(LR) fixup not supported");
    10161012                case 9:
    1017                   r.length = 2;
     1013                  r.r_length = 2;
    10181014                  break;
    10191015                case 11:
     
    10281024                {
    10291025                case 0:         /* T0: SEGDEF */
    1030                   r.ext = 0;
     1026                  r.r_extern = 0;
    10311027                  if (target_index == seg_code + 1)
    1032                     r.symbolnum = N_TEXT;
     1028                    r.r_symbolnum = N_TEXT;
    10331029                  else if (target_index == seg_data + 1)
    10341030                    {
    1035                       r.symbolnum = N_DATA;
     1031                      r.r_symbolnum = N_DATA;
    10361032                      disp += (seg_code >= 0 ? segments[seg_code].size : 0);
    10371033                    }
    10381034                  else if (target_index == seg_bss + 1)
    10391035                    {
    1040                       r.symbolnum = N_BSS;
     1036                      r.r_symbolnum = N_BSS;
    10411037                      disp += (seg_code >= 0 ? segments[seg_code].size : 0);
    10421038                      disp += (seg_data >= 0 ? segments[seg_data].size : 0);
     
    10501046                  break;
    10511047                case 2:         /* T2: EXTDEF */
    1052                   r.ext = 1;
     1048                  r.r_extern = 1;
    10531049                  if (target_index < 1 || target_index > GROW_COUNT (extdefs))
    10541050                    error2 ("FIXUPP: EXTDEF index out of range");
    1055                   r.symbolnum = target_index - 1;
     1051                  r.r_symbolnum = target_index - 1;
    10561052                  break;
    10571053                default:
     
    10851081                abort ();
    10861082
    1087               if (r.address + 4 > segments[cur_seg].size)
     1083              if (r.r_address + 4 > segments[cur_seg].size)
    10881084                error2 ("FIXUPP: fixup beyond end of segment");
    1089               *((dword *)(segments[cur_seg].data + r.address))
    1090                 += r.pcrel ? disp - (r.address + 4) : disp;
     1085              *((dword *)(segments[cur_seg].data + r.r_address))
     1086                += r.r_pcrel ? disp - (r.r_address + 4) : disp;
    10911087            }
    10921088        }
     
    11271123  for (i = 0; i < GROW_COUNT (extdefs); ++i)
    11281124    {
    1129       n.type = N_EXT;
    1130       n.string = 0;
    1131       n.value = extdefs[i].size;
    1132       n.other = 0;
    1133       n.desc = 0;
     1125      n.n_type = N_EXT;
     1126      n.n_un.n_strx = 0;
     1127      n.n_value = extdefs[i].size;
     1128      n.n_other = 0;
     1129      n.n_desc = 0;
    11341130      j = GROW_ADD (symbols);
    11351131      symbols[j].name = xstrdup (extdefs[i].name);
     
    11431139        skip = TRUE;
    11441140      else if (pubdefs[i].seg == seg_code + 1)
    1145         n.type = N_TEXT | N_EXT;
     1141        n.n_type = N_TEXT | N_EXT;
    11461142      else if (pubdefs[i].seg == seg_data + 1)
    1147         n.type = N_DATA | N_EXT;
     1143        n.n_type = N_DATA | N_EXT;
    11481144      else
    11491145        skip = TRUE;
    11501146      if (!skip)
    11511147        {
    1152           n.string = 0;
    1153           n.value = pubdefs[i].offset;
    1154           n.other = 0;
    1155           n.desc = 0;
     1148          n.n_un.n_strx = 0;
     1149          n.n_value = pubdefs[i].offset;
     1150          n.n_other = 0;
     1151          n.n_desc = 0;
    11561152          j = GROW_ADD (symbols);
    11571153          symbols[j].name = xstrdup (pubdefs[i].name);
     
    11731169    {
    11741170      if (symbols[i].name == NULL)
    1175         symbols[i].n.string = 0;
     1171        symbols[i].n.n_un.n_strx = 0;
    11761172      else
    11771173        {
    1178           symbols[i].n.string = str_size;
     1174          symbols[i].n.n_un.n_strx = str_size;
    11791175          str_size += strlen (symbols[i].name) + 1;
    11801176        }
     
    11921188static void conv_modend (void)
    11931189{
    1194   struct a_out_header h;
     1190  struct exec h;
    11951191  int i;
    11961192
    11971193  make_symtab ();
    1198   h.magic = 0407;
    1199   h.machtype = 0;
    1200   h.flags = 0;
    1201   h.text_size = (seg_code >= 0 ? segments[seg_code].size : 0);
    1202   h.data_size = (seg_data >= 0 ? segments[seg_data].size : 0);
    1203   h.bss_size =  (seg_bss  >= 0 ? segments[seg_bss ].size : 0);
    1204   h.sym_size = GROW_COUNT (symbols) * sizeof (struct nlist);
    1205   h.entry = 0;
    1206   h.trsize = GROW_COUNT (trelocs) * sizeof (struct reloc);
    1207   h.drsize = GROW_COUNT (drelocs) * sizeof (struct reloc);
     1194  N_SET_MAGIC (h, OMAGIC);
     1195  N_SET_MACHTYPE (h, 0);
     1196  N_SET_FLAGS (h, 0);
     1197  h.a_text = (seg_code >= 0 ? segments[seg_code].size : 0);
     1198  h.a_data = (seg_data >= 0 ? segments[seg_data].size : 0);
     1199  h.a_bss =  (seg_bss  >= 0 ? segments[seg_bss ].size : 0);
     1200  h.a_syms = GROW_COUNT (symbols) * sizeof (struct nlist);
     1201  h.a_entry = 0;
     1202  h.a_trsize = GROW_COUNT (trelocs) * sizeof (struct relocation_info);
     1203  h.a_drsize = GROW_COUNT (drelocs) * sizeof (struct relocation_info);
    12081204  fwrite (&h, sizeof (h), 1, out_file);
    12091205  if (seg_code >= 0)
     
    12121208    fwrite (segments[seg_data].data, segments[seg_data].size, 1, out_file);
    12131209  for (i = 0; i < GROW_COUNT (trelocs); ++i)
    1214     fwrite (&trelocs[i], sizeof (struct reloc), 1, out_file);
     1210    fwrite (&trelocs[i], sizeof (struct relocation_info), 1, out_file);
    12151211  for (i = 0; i < GROW_COUNT (drelocs); ++i)
    1216     fwrite (&drelocs[i], sizeof (struct reloc), 1, out_file);
     1212    fwrite (&drelocs[i], sizeof (struct relocation_info), 1, out_file);
    12171213  write_symtab ();
    12181214}
Note: See TracChangeset for help on using the changeset viewer.