Thread View: gnu.utils.bug
1 messages
1 total messages
Started by Peter R. Ham
Thu, 14 Sep 1989 17:26
context diffs for byte swapping ld.c (reposting)
Author: Peter R. Ham
Date: Thu, 14 Sep 1989 17:26
Date: Thu, 14 Sep 1989 17:26
388 lines
11663 bytes
11663 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads