[gnu.utils.bug] ld alignment, padding problems; a little arg count toejam too

bob@MorningStar.Com (Bob Sutterfield) (12/09/89)

In making ld.c work with our  cross-compiler environment (gcc 1.36 and
gas 1.34 running on SPARC, targeting standalone 680[02]0  and 803[78]6
boards), the following changes were needed.  Only the header change (I
think) is a  local configuration  issue, some are  lint,  and some are
alignment and padding problems that will affect any similar situation.

*** binutils/ld.c.dist	Tue Oct 17 12:50:24 1989
--- binutils/ld.c	Tue Dec  5 17:02:57 1989
***************
*** 32,35 ****
--- 32,53 ----
  #else
  #include <a.out.h>
+ #ifdef MST68K
+ /********************
+  * mods for MST
+  */
+ # define m68020
+ # undef is68k
+ # undef sparc
+ # undef N_DATADDR
+ # undef N_TXTADDR
+ # define N_TXTADDR(x) (sizeof(struct exec))
+ # define N_DATADDR(x) \
+ 	(N_TXTADDR(x)+(x).a_text)
+ #endif /* MST68K */
+ #endif /* COFF_ENCAPSULATE */
+ 
+ #ifdef sparc
+ #define relocation_info reloc_info_sparc
+ #define r_symbolnum r_index
  #endif
  
***************
*** 137,141 ****
--- 155,163 ----
  #endif
  #ifndef INITIALIZE_HEADER
+ #ifdef MST68K
+ #define INITIALIZE_HEADER outheader.a_magic = OMAGIC
+ #else /* MST68K */
  #define INITIALIZE_HEADER outheader.a_machtype = M_68020
+ #endif /* MST68K */
  #endif
  #endif
***************
*** 2454,2458 ****
--- 2476,2484 ----
    /* Make sure bss starts out aligned as much as anyone can want.  */
  
+ #ifdef MST68K
+   data_size = (data_size + sizeof(long) - 1) & ~(sizeof(long)-1);
+ #else /* MST68K */
    data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
+ #endif /* MST68K */
  
    /* Set up the set element vector */
***************
*** 3443,3447 ****
      fprintf (stderr, "Copying and relocating text:\n\n");
  
!   each_full_file (copy_text);
    file_close ();
  
--- 3469,3473 ----
      fprintf (stderr, "Copying and relocating text:\n\n");
  
!   each_full_file (copy_text, 0);
    file_close ();
  
***************
*** 3464,3468 ****
  read_relocation ()
  {
!   each_full_file (read_file_relocation);
  }
  
--- 3490,3494 ----
  read_relocation ()
  {
!   each_full_file (read_file_relocation, 0);
  }
  
***************
*** 3570,3574 ****
      fprintf (stderr, "Copying and relocating data:\n\n");
  
!   each_full_file (copy_data);
    file_close ();
  
--- 3596,3600 ----
      fprintf (stderr, "Copying and relocating data:\n\n");
  
!   each_full_file (copy_data, 0);
    file_close ();
  
***************
*** 3665,3669 ****
--- 3691,3698 ----
  
        if (addr >= data_size)
+ 	{
+ 	printf("perform_relocation(0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X): addr 0x%X\n", data, pc_relocation, data_size, reloc_info, reloc_size, entry, addr);
  	fatal_with_file ("relocation address out of range in ", entry);
+ 	}
  
        if (RELOC_EXTERN_P(p))
***************
*** 3784,3793 ****
  
  	case 2:
  	  if (RELOC_MEMORY_SUB_P(p))
! 	    relocation -= mask & *(long *) (data + addr);
  	  else if (RELOC_MEMORY_ADD_P(p))
! 	    relocation += mask & *(long *) (data + addr);
  	  *(long *) (data + addr) &= ~mask;
  	  *(long *) (data + addr) |= relocation;
  	  break;
  
--- 3813,3833 ----
  
  	case 2:
+ #ifdef MST68K
  	  if (RELOC_MEMORY_SUB_P(p))
! 	       relocation -= mask & ((*(unsigned short *) (data + addr) << 16) | (*(unsigned short *)(data + addr + 2)));
  	  else if (RELOC_MEMORY_ADD_P(p))
! 	       relocation += mask & ((*(unsigned short *) (data + addr) << 16) | (*(unsigned short *)(data + addr + 2)));
! 	  *(short *) (data + addr) &= ~mask >> 16;
! 	  *(short *) (data + addr + 2) &= ~mask;
! 	  *(short *) (data + addr) |= relocation >> 16;
! 	  *(short *) (data + addr + 2) |= relocation;
! #else /* MST68K */
! 	  if (RELOC_MEMORY_SUB_P(p))
! 	       relocation -= mask & *(long *) (data + addr);
! 	  else if (RELOC_MEMORY_ADD_P(p))
! 	       relocation += mask & *(long *) (data + addr);
  	  *(long *) (data + addr) &= ~mask;
  	  *(long *) (data + addr) |= relocation;
+ #endif /* MST68K */
  	  break;
  
***************
*** 3838,3842 ****
    /* Write out the relocations of all files, remembered from copy_text.  */
  
!   each_full_file (coptxtrel);
  
    if (trace_files)
--- 3878,3882 ----
    /* Write out the relocations of all files, remembered from copy_text.  */
  
!   each_full_file (coptxtrel, 0);
  
    if (trace_files)
***************
*** 3843,3847 ****
      fprintf (stderr, "\nWriting data relocation:\n\n");
  
!   each_full_file (copdatrel);
  
    if (trace_files)
--- 3883,3887 ----
      fprintf (stderr, "\nWriting data relocation:\n\n");
  
!   each_full_file (copdatrel, 0);
  
    if (trace_files)