crl@GIBBS.PHYSICS.PURDUE.EDU ("Charles R. LaBrec") (10/23/88)
Here are the mods required to get "ld" running on an Integrated Solutions 68k machine running 4.3 BSD Rel 4.0D. The biggest changes are due to a hack ISI put into their "ld" and libc. It treats symbols that begin with a "_$" specially. You don't want to know any more. Charles LaBrec crl @ maxwell.physics.purdue.edu *** ld.c-dist Wed Sep 14 18:19:50 1988 --- ld.c Sun Oct 23 01:11:18 1988 *************** *** 190,196 **** --- 197,206 ---- #ifdef vax #define N_TXTADDR(X) 0 #endif + #ifdef is68k + #define N_TXTADDR(x) (sizeof (HEADER_TYPE)) #endif + #endif #ifndef N_DATADDR #ifdef vax *************** *** 198,204 **** --- 208,220 ---- (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \ : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1)))) #endif + #ifdef is68k + #define SEGMENT_SIZE 0x20000 + #define N_DATADDR(x) \ + (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \ + : (SEGMENT_SIZE+((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1)))) #endif + #endif #ifdef hpux #define getpagesize() EXEC_PAGESIZE *************** *** 208,213 **** --- 224,239 ---- #ifdef sun #define INITIALIZE_HEADER outheader.a_machtype = M_68020 #endif + + #ifdef is68k + #ifdef M_68020 + /* ISI rel 4.0D doesn't use it, and rel 3.05 doesn't have an a_machtype field + and so won't recognize the magic number. To keep binary compatibility for + now, just ignore it */ + #define INITIALIZE_HEADER outheader.a_machtype = 0; + #endif + #endif /* is68k */ + #ifdef hpux #define INITIALIZE_HEADER outheader.a_machtype = HP9000S200_ID #endif *************** *** 584,594 **** --- 610,624 ---- /* Standard directories to search for files specified by -l. */ char *standard_search_dirs[] = + #ifdef STANDARD_SEARCH_DIRS + STANDARD_SEARCH_DIRS; + #else #ifdef NON_NATIVE {"/usr/local/lib/gnu"}; #else {"/lib", "/usr/lib", "/usr/local/lib"}; #endif + #endif /* Actual vector of directories to search; this contains those specified with -L plus the standard ones. */ *************** *** 1496,1502 **** --- 1526,1552 ---- } } else + #ifdef is68k + if (!oldref) + { + if (entry->superfile && type == (N_UNDF | N_EXT) && name[1] == '$') + { + /* this is an ISI $-conditional, skip it */ + sp->referenced = 0; + if (sp->trace) + { + fprintf (stderr, "symbol %s is a $-conditional ignored in ", sp->name); + print_file_name (entry, stderr); + fprintf (stderr, "\n"); + } + return; + } + else + undefined_global_sym_count++; + } + #else if (!oldref) undefined_global_sym_count++; + #endif if (sp == end_symbol && entry->just_syms_flag && !T_flag_specified) text_start = nlist_p->n_value; *************** *** 1872,1887 **** register struct nlist *p; register struct nlist *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist); for (p = entry->symbols; p < end; p++) { register int type = p->n_type; ! if (type & N_EXT && (type != (N_UNDF | N_EXT) || p->n_value)) { - register char *name = p->n_un.n_strx + entry->strings; register symbol *sp = getsym_soft (name); /* If this symbol has not been hashed, we can't be looking for it. */ if (!sp) continue; --- 1922,1966 ---- register struct nlist *p; register struct nlist *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist); + #ifdef is68k + register int dolcond = 0; + #endif for (p = entry->symbols; p < end; p++) { register int type = p->n_type; + register char *name = p->n_un.n_strx + entry->strings; ! if (type & N_EXT && (type != (N_UNDF | N_EXT) || p->n_value ! #ifdef is68k ! || name[1] == '$' ! #endif ! )) { register symbol *sp = getsym_soft (name); + #ifdef is68k + /* ISI has a really kludgey way of trying to cut down memory usage. + If a symbol begins with _$, then the object file is included only + if the rest of the symbol name has been referenced. */ + if (name[1] == '$') + { + sp = getsym_soft (&name[2]); + dolcond = 1; + if (!sp) continue; + if (sp->referenced) + { + if (write_map) + { + print_file_name (entry, stdout); + fprintf (stdout, " needed due to $-conditional %s\n", name); + } + return 1; + } + continue; + } + #endif + /* If this symbol has not been hashed, we can't be looking for it. */ if (!sp) continue; *************** *** 1889,1894 **** --- 1968,1976 ---- if (sp->referenced && !sp->defined) { /* This is a symbol we are looking for. */ + #ifdef is68k + if (dolcond) continue; + #endif if (type == (N_UNDF | N_EXT)) { /* Symbol being defined as common.