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)