ham@Neon.Stanford.EDU (Peter R. Ham) (09/15/89)
Sorry, about reposting this again. I should have
posted context diffs the first time. Meanwhile, several
people have asked me or them.
*** ld.c Thu Aug 31 13:18:48 1989
--- /xxV/cmds/gld/dist//ld.c Tue Aug 8 14:41:31 1989
***************
*** 33,229 ****
#include <a.out.h>
#endif
- /*
- ** Byte swapping code.
- */
- #ifndef MUST_BYTE_SWAP
- #define WHEN_BYTE_SWAPPING(stmt) (stmt)
-
- void
- byte_swap_long_in_place(src, count)
- register char *src;
- register int count;
- /* Byte swap the longs in "src" without copying them anywhere. "count"
- * gives the number of bytes to swap. It is truncated to an integral
- * number of longwords (i.e. divisible by four).
- */
- {
- register char *dst = src + 3;
- register unsigned int temp;
-
- count >>= 2; /* number of longs */
-
- while (count-- > 0)
- {
- temp = *src; *src++ = *dst; *dst-- = temp;
- temp = *src; *src++ = *dst; *dst-- = temp;
- src += 2;
- dst += 6;
- }
- }
-
- #define UR_BITS 3 /* lg(# of times loop unrolled) */
- #define UR_TIMES (1<<UR_BITS) /* # of times loop unrolled */
- #define UR_MASK (UR_TIMES - 1)
-
- void
- byte_swap_short_copy(from, to, bytes)
- register char *from, *to;
- unsigned bytes;
- {
- register unsigned long temp;
- register int shorts;
-
- shorts = (bytes>>1)+1;
- while ((--shorts)&UR_MASK)/* until remainder is multiple of UR_TIMES */
- {
- temp = *from++;
- *to++ = *from++;
- *to++ = temp;
- }
-
- shorts >>= UR_BITS; /* n /= UR_TIMES, # of times for unrolled loop */
- while (--shorts >= 0) {
-
- #define STEP temp = *from++;*to++ = *from++;*to++ = temp;
-
- #if UR_BITS == 0
- STEP
- #endif UR_BITS == 0
-
- #if UR_BITS == 1
- STEP
- STEP
- #endif UR_BITS == 1
-
- #if UR_BITS == 2
- STEP
- STEP
- STEP
- STEP
- #endif UR_BITS == 2
-
- #if UR_BITS == 3
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- #endif UR_BITS == 3
-
- #if UR_BITS == 4
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- STEP
- #endif UR_BITS == 4
-
- }
- } /* byte_swap_short_copy */
-
-
- void
- byte_swap_short_in_place(ptr, n)
- char *ptr;
- unsigned n;
- {
- byte_swap_short_copy(ptr, ptr, n);
- }
-
- void
- byte_swap_exec(x)
- struct exec *x;
- {
- byte_swap_long_in_place(x, sizeof (struct exec));
- }
-
- byte_swap_nlist(x)
- struct nlist *x;
- {
- byte_swap_long_in_place(&(x->n_un.n_strx), sizeof (x->n_un.n_strx));
- byte_swap_short_in_place(&(x->n_desc), sizeof (x->n_desc));
- byte_swap_long_in_place(&(x->n_value), sizeof (x->n_value));
-
- }
-
- void
- byte_swap_nlist_array(x, n)
- struct nlist *x;
- int n;
- {
- struct nlist *p = x;
-
- while ( p < ( x + n ))
- {
- byte_swap_nlist(p);
- p++;
- }
- }
-
- byte_swap_relocation_info(relptr, relend)
- struct relocation_info *relptr, *relend;
- {
- while (relptr < relend)
- {
- register unsigned char c;
- register unsigned char *cp;
-
- byte_swap_long_in_place(relptr, 2*sizeof(long));
- cp = (unsigned char *)&((long *)relptr)[1];
- c = cp[0];
- cp[0] = cp[1];
- cp[1] = cp[2];
- cp[2] = cp[3];
- cp[3] = (c>>4) | /* move filler 4 bits */
- ((c&0x08)<<1) | /* move r_extern */
- ((c&0x06)<<4) | /* move r_length */
- ((c&0x01)<<7); /* move r_pcrel */
- relptr++;
- }
- }
-
- unbyte_swap_relocation_info(relptr, relend)
- struct relocation_info *relptr, *relend;
- {
- while (relptr < relend)
- {
- register unsigned char c;
- register unsigned char *cp;
-
- byte_swap_long_in_place(relptr, 2*sizeof(long));
- cp = (unsigned char *)&((long *)relptr)[1];
- c = cp[0];
- cp[0] = cp[1];
- cp[1] = cp[2]; /* These next two lines are a little suspect. */
- cp[2] = cp[3];
- cp[3] = (c<<4) | /* move filler 4 bits */
- ((c&0x10)>>1) | /* move r_extern */
- ((c&0x60)>>4) | /* move r_length */
- ((c&0x80)>>7); /* move r_pcrel */
- relptr++;
- }
- }
-
- #else
- #define WHEN_BYTE_SWAPPING(stmt)
- #endif
-
-
#ifndef N_SET_MAGIC
#define N_SET_MAGIC(exec, val) ((exec).a_magic = val)
#endif
--- 33,38 ----
***************
*** 1604,1610 ****
len = read (desc, loc, sizeof (struct exec));
if (len != sizeof (struct exec))
fatal_with_file ("failure reading header of ", entry);
- WHEN_BYTE_SWAPPING(byte_swap_exec(&(entry->header));)
if (N_BADMAG (*loc))
fatal_with_file ("bad magic number in ", entry);
--- 1413,1418 ----
***************
*** 1631,1642 ****
lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
fatal_with_file ("premature end of file in symbols of ", entry);
! WHEN_BYTE_SWAPPING(byte_swap_nlist_array(entry->symbols,
! entry->header.a_syms / (sizeof (struct nlist)));)
lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
if (sizeof str_size != read (desc, &str_size, sizeof str_size))
fatal_with_file ("bad string table size in ", entry);
! WHEN_BYTE_SWAPPING(byte_swap_long_in_place(&str_size, sizeof str_size);)
entry->string_size = str_size;
}
--- 1439,1449 ----
lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
fatal_with_file ("premature end of file in symbols of ", entry);
!
lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
if (sizeof str_size != read (desc, &str_size, sizeof str_size))
fatal_with_file ("bad string table size in ", entry);
!
entry->string_size = str_size;
}
***************
*** 3361,3369 ****
if (need_coff_header)
mywrite (&coffheader, sizeof coffheader, 1, outdesc);
#endif
- WHEN_BYTE_SWAPPING(byte_swap_exec(&outheader);)
mywrite (&outheader, sizeof (struct exec), 1, outdesc);
- WHEN_BYTE_SWAPPING(byte_swap_exec(&outheader);)
/* Output whatever padding is required in the executable file
between the header and the start of the text. */
--- 3168,3174 ----
***************
*** 3429,3438 ****
fprintf (stderr, "Return from read: %d\n", read_return);
fatal_with_file ("premature eof in text relocatino of ", entry);
}
! WHEN_BYTE_SWAPPING(unbyte_swap_relocation_info(reloc,
! reloc +
! (entry->header.a_trsize / sizeof (struct relocation_info)));)
! entry->textrel = reloc;
}
if (!entry->datarel)
--- 3234,3240 ----
fprintf (stderr, "Return from read: %d\n", read_return);
fatal_with_file ("premature eof in text relocatino of ", entry);
}
! entry->textrel = reloc;
}
if (!entry->datarel)
***************
*** 3445,3454 ****
L_SET);
if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
fatal_with_file ("premature eof in text relocation of ", entry);
- WHEN_BYTE_SWAPPING(unbyte_swap_relocation_info(reloc,
- reloc +
- (entry->header.a_drsize / sizeof (struct relocation_info)));)
-
entry->datarel = reloc;
}
}
--- 3247,3252 ----
***************
*** 3488,3496 ****
lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
fatal_with_file ("premature eof in text relocation of ", entry);
- WHEN_BYTE_SWAPPING(unbyte_swap_relocation_info(reloc,
- reloc +
- (entry->header.a_trsize / sizeof (struct relocation_info)));)
}
/* Read the text section into core. */
--- 3286,3291 ----
***************
*** 3569,3577 ****
0);
if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
fatal_with_file ("premature eof in data relocation of ", entry);
- WHEN_BYTE_SWAPPING(un_byte_swap_relocation_info(reloc,
- reloc +
- (entry->header.a_drsize / sizeof (struct relocation_info)));)
}
lseek (desc, text_offset (entry) + entry->header.a_text, 0);
--- 3364,3369 ----
***************
*** 3694,3702 ****
switch (RELOC_TARGET_SIZE(p))
{
case 0:
- /*
- ** A single byte does not need to be byte swapped.
- */
if (RELOC_MEMORY_ADD_P(p))
relocation += mask & *(char *) (data + addr);
*(char *) (data + addr) &= ~mask;
--- 3486,3491 ----
***************
*** 3704,3730 ****
break;
case 1:
- /*
- ** A short DOES need to be byte swapped.
- */
- WHEN_BYTE_SWAPPING(byte_swap_short_in_place((short *) (data + addr), sizeof (short));)
if (RELOC_MEMORY_ADD_P(p))
relocation += mask & *(short *) (data + addr);
*(short *) (data + addr) &= ~mask;
*(short *) (data + addr) |= relocation;
- WHEN_BYTE_SWAPPING(byte_swap_short_in_place((short *) (data + addr), sizeof (short));)
break;
case 2:
- /*
- ** A long DOES need to be byte swapped.
- */
- WHEN_BYTE_SWAPPING(byte_swap_long_in_place((long *) (data + addr), sizeof (long));)
if (RELOC_MEMORY_ADD_P(p))
relocation += mask & *(long *) (data + addr);
*(long *) (data + addr) &= ~mask;
*(long *) (data + addr) |= relocation;
- WHEN_BYTE_SWAPPING(byte_swap_long_in_place((long *) (data + addr), sizeof (long));)
break;
default:
--- 3493,3509 ----
***************
*** 4105,4111 ****
/* Output the buffer full of `struct nlist's. */
lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
- WHEN_BYTE_SWAPPING(byte_swap_nlist_array(buf, bufp - buf);)
mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
symbol_table_len += sizeof (struct nlist) * (bufp - buf);
--- 3884,3889 ----
***************
*** 4118,4126 ****
/* Now the total string table size is known, so write it.
We are already positioned at the right place in the file. */
- WHEN_BYTE_SWAPPING(byte_swap_long_in_place(&strtab_size, sizeof strtab_size);)
mywrite (&strtab_size, sizeof (int), 1, outdesc); /* we're at right place */
- WHEN_BYTE_SWAPPING(byte_swap_long_in_place(&strtab_size, sizeof strtab_size);)
/* Write the strings for the global symbols. */
--- 3896,3902 ----
***************
*** 4230,4236 ****
/* All the symbols are now in BUF; write them. */
lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
- WHEN_BYTE_SWAPPING(byte_swap_nlist_array(buf, bufp - buf);)
mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
symbol_table_len += sizeof (struct nlist) * (bufp - buf);
--- 4006,4011 ----
--
Peter Ham PO Box 3430 (h)(415) 324-9645
MS Computer Science Student Stanford, CA ham@polya.stanford.edu
Stanford University 94309 (o)(415) 723-2067