Many recent fixes from Paul K, add support for chaining of shared lib deps.

This commit is contained in:
Jordan K. Hubbard 1993-11-30 20:47:54 +00:00
parent 0da22b8b69
commit 52c4ca7af3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=811
18 changed files with 704 additions and 233 deletions

View file

@ -1,18 +1,14 @@
# $Id: Makefile,v 1.6 1993/11/09 21:23:07 paul Exp $
# $Id: Makefile,v 1.8 1993/11/03 13:01:36 cgd Exp $
#
PROG= ld
SRCS= ld.c symbol.c lib.c shlib.c warnings.c etc.c rrs.c xbits.c md.c
CFLAGS += -static -I$(.CURDIR) -I$(.CURDIR)/$(MACHINE)
CFLAGS += -g -I$(.CURDIR) -I$(.CURDIR)/$(MACHINE)
LDADD+= -lgnumalloc
DPADD+= /usr/lib/libgnumalloc.a
LDFLAGS+= -Xlinker -Bstatic
SUBDIR= ldconfig ldd
.if !defined(NOPIC)
SUBDIR+= rtld
.endif
SUBDIR= ldconfig ldd rtld
.PATH: $(.CURDIR)/$(MACHINE)

View file

@ -1,5 +1,5 @@
/*
* $Id: etc.c,v 1.2 1993/10/21 00:52:52 pk Exp $
* $Id: etc.c,v 1.2 1993/11/09 04:18:52 paul Exp $
*/
#include <sys/param.h>
@ -72,7 +72,7 @@ fatal(fmt, va_alist)
(void)fprintf(stderr, "\n");
va_end(ap);
if (outdesc >= 0)
if (outdesc > 0)
unlink(output_filename);
exit(1);
}

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: md.c,v 1.3 1993/11/15 20:58:20 paul Exp $
* $Id: md.c,v 1.4 1993/11/22 19:05:23 jkh Exp $
*/
#include <sys/param.h>
@ -242,7 +242,7 @@ long where;
long *savep;
{
*savep = *(long *)where;
*(char *)where = BPT;
*(char *)where = TRAP;
}
#ifdef NEED_SWAP

View file

@ -1,5 +1,5 @@
/*
* $Id: md.h,v 1.2 1993/11/09 04:19:17 paul Exp $ - I386 dependent definitions
* $Id: md.h,v 1.3 1993/11/22 19:05:24 jkh Exp $ - I386 dependent definitions
*/
@ -50,7 +50,7 @@ typedef struct jmpslot {
#define NOP 0x90
#define CALL 0xe890 /* NOP + CALL opcode */
#define JUMP 0xe990 /* NOP + JMP opcode */
#define BPT 0xcc /* breakpoint: INT 3 */
#define TRAP 0xcc /* INT 3 */
/*
* Byte swap defs for cross linking

View file

@ -32,7 +32,7 @@ static char sccsid[] = "@(#)ld.c 6.10 (Berkeley) 5/22/91";
Set, indirect, and warning symbol features added by Randy Smith. */
/*
* $Id: ld.c,v 1.9 1993/11/18 20:52:31 jkh Exp $
* $Id: ld.c,v 1.10 1993/11/22 19:04:40 jkh Exp $
*/
/* Define how to initialize system-dependent header fields. */
@ -73,6 +73,10 @@ int force_common_definition;
/* 1 => assign jmp slots to text symbols in shared objects even if non-PIC */
int force_alias_definition;
/* 1 => some files contain PIC code, affects relocation bits
if `relocatable_output'. */
int pic_code_seen;
/*
* Which symbols should be stripped (omitted from the output): none, all, or
* debugger symbols.
@ -176,6 +180,9 @@ main(argc, argv)
make_executable = 1;
force_executable = 0;
link_mode = DYNAMIC;
#ifdef SUNOS4
link_mode |= SILLYARCHIVE;
#endif
soversion = LD_VERSION_BSD;
/* Initialize the cumulative counts of symbols. */
@ -201,6 +208,10 @@ main(argc, argv)
building_shared_object =
(!relocatable_output && (link_mode & SHAREABLE));
if (building_shared_object && entry_symbol) {
fatal("`-Bshareable' and `-e' options are mutually exclusive");
}
/* Create the symbols `etext', `edata' and `end'. */
symtab_init(relocatable_output);
@ -382,6 +393,12 @@ decode_command(argc, argv)
link_mode |= FORCEARCHIVE;
else if (strcmp(string, "shareable") == 0)
link_mode |= SHAREABLE;
#ifdef SUN_COMPAT
else if (strcmp(string, "silly") == 0)
link_mode |= SILLYARCHIVE;
else if (strcmp(string, "~silly") == 0)
link_mode &= ~SILLYARCHIVE;
#endif
}
if (argv[i][1] == 'A') {
if (p != file_table)
@ -476,6 +493,10 @@ decode_option(swt, arg)
return;
if (!strcmp(swt + 1, "assert"))
return;
#ifdef SUN_COMPAT
if (!strcmp(swt + 1, "Bsilly"))
return;
#endif
if (!strcmp(swt + 1, "Ttext")) {
text_start = parse(arg, "%x", "invalid argument to -Ttext");
T_flag_specified = 1;
@ -636,17 +657,38 @@ each_file(function, arg)
for (i = 0; i < number_of_files; i++) {
register struct file_entry *entry = &file_table[i];
register struct file_entry *subentry;
if (entry->scrapped)
continue;
if (entry->library_flag) {
register struct file_entry *subentry = entry->subfiles;
if (!entry->library_flag)
(*function) (entry, arg);
subentry = entry->subfiles;
for (; subentry; subentry = subentry->chain) {
if (subentry->scrapped)
continue;
(*function) (subentry, arg);
}
#ifdef SUN_COMPAT
if (entry->silly_archive) {
if (!entry->is_dynamic)
error("Silly");
if (!entry->silly_archive->library_flag)
error("Sillier");
subentry = entry->silly_archive->subfiles;
for (; subentry; subentry = subentry->chain) {
if (subentry->scrapped)
continue;
(*function) (subentry, arg);
}
} else
(*function) (entry, arg);
}
#endif
}
}
@ -696,15 +738,41 @@ each_full_file(function, arg)
for (i = 0; i < number_of_files; i++) {
register struct file_entry *entry = &file_table[i];
if (entry->scrapped ||
entry->just_syms_flag || entry->is_dynamic)
register struct file_entry *subentry;
if (entry->scrapped || entry->just_syms_flag)
continue;
if (entry->library_flag) {
register struct file_entry *subentry = entry->subfiles;
for (; subentry; subentry = subentry->chain)
#ifdef SUN_COMPAT
if (entry->silly_archive) {
if (!entry->is_dynamic)
error("Silly");
if (!entry->silly_archive->library_flag)
error("Sillier");
subentry = entry->silly_archive->subfiles;
for (; subentry; subentry = subentry->chain) {
if (subentry->scrapped)
continue;
(*function) (subentry, arg);
} else
}
}
#endif
if (entry->is_dynamic)
continue;
if (!entry->library_flag)
(*function) (entry, arg);
subentry = entry->subfiles;
for (; subentry; subentry = subentry->chain) {
if (subentry->scrapped)
continue;
(*function) (subentry, arg);
}
}
}
@ -729,7 +797,7 @@ file_open (entry)
{
register int desc;
if (entry->superfile)
if (entry->superfile && entry->superfile->library_flag)
return file_open (entry->superfile);
if (entry == input_file)
@ -827,6 +895,8 @@ read_entry_symbols (desc, entry)
entry->symbols[i].next = NULL;
entry->symbols[i].gotslot_offset = -1;
entry->symbols[i].gotslot_claimed = 0;
entry->symbols[i].write = 0;
entry->symbols[i].is_L_symbol = 0;
entry->symbols[i].rename = 0;
}
@ -980,7 +1050,7 @@ read_file_symbols (entry)
return;
}
entry->is_dynamic = 1;
if (rrs_add_shobj(entry))
if (entry->superfile || rrs_add_shobj(entry))
read_shared_object(desc, entry);
else
entry->scrapped = 1;
@ -1062,25 +1132,11 @@ enter_file_symbols (entry)
} else if (p->n_type & N_EXT) {
enter_global_ref(lsp,
p->n_un.n_strx + entry->strings, entry);
} else if (p->n_un.n_strx && !(p->n_type & (N_STAB | N_EXT))
&& !entry->is_dynamic) {
if ((p->n_un.n_strx + entry->strings)[0] != LPREFIX)
non_L_local_sym_count++;
local_sym_count++;
} else if (!entry->is_dynamic)
debugger_sym_count++;
} else if (p->n_un.n_strx &&
(p->n_un.n_strx + entry->strings)[0] == LPREFIX)
lsp->is_L_symbol = 1;
}
/*
* Count one for the local symbol that we generate,
* whose name is the file's name (usually) and whose address
* is the start of the file's text.
*/
if (!entry->is_dynamic) {
local_sym_count++;
non_L_local_sym_count++;
}
}
/*
@ -1092,7 +1148,7 @@ enter_file_symbols (entry)
* This chain starts in the `refs' for symbols from relocatable objects. A
* backpointer to the global symbol is kept in LSP.
*
* Symbols from shared objects are linked through `dynref'. For such symbols
* Symbols from shared objects are linked through `soref'. For such symbols
* that's all we do at this stage, with the exception of the case where the
* symbol is a common. The `referenced' bit is only set for references from
* relocatable objects.
@ -1172,6 +1228,8 @@ enter_global_ref (lsp, name, entry)
#ifdef N_SIZE
if (type == (N_SIZE | N_EXT)) {
if (relocatable_output && nzp->nz_value != 0 && sp->size == 0)
size_sym_count++;
if (sp->size < nzp->nz_value)
sp->size = nzp->nz_value;
} else
@ -1297,7 +1355,7 @@ void consider_relocation();
* symbols originating from shared objects is searched for a definition.
*
* 2) Then the relocation information of each relocatable file is examined
* for for possible contributions to the RRS section.
* for possible contributions to the RRS section.
*
* 3) When this is done, the sizes and start addresses are set of all segments
* that will appear in the output file (including the RRS segment).
@ -1335,10 +1393,8 @@ digest_symbols ()
defined_global_sym_count = 0;
digest_pass1();
if (1 || !relocatable_output) {
each_full_file(consider_relocation, 0); /* Text */
each_full_file(consider_relocation, 1); /* Data */
}
each_full_file(consider_relocation, 0); /* Text */
each_full_file(consider_relocation, 1); /* Data */
/*
* Compute total size of sections.
@ -1419,6 +1475,23 @@ printf("bssstart = %#x, bsssize = %#x\n",
bss_size = 0;
data_size += data_pad;
/*
* Calculate total number of symbols that will go into
* the output symbol table (barring DISCARD_* settings).
*/
global_sym_count = defined_global_sym_count +
undefined_global_sym_count;
if (dynamic_symbol->referenced)
global_sym_count++;
if (got_symbol->referenced)
global_sym_count++;
if (relocatable_output)
/* For each alias we write out two struct nlists */
global_sym_count += global_alias_count + size_sym_count;
}
void
@ -1690,8 +1763,10 @@ consider_relocation (entry, dataseg)
if (relocatable_output) {
lsp = &entry->symbols[reloc->r_symbolnum];
if (RELOC_BASEREL_P(reloc) && !RELOC_EXTERN_P(reloc)) {
lsp->rename = 1;
if (RELOC_BASEREL_P(reloc)) {
pic_code_seen = 1;
if (!RELOC_EXTERN_P(reloc))
lsp->rename = 1;
}
continue;
}
@ -1728,12 +1803,12 @@ consider_relocation (entry, dataseg)
sp = lsp->symbol;
if (sp->alias)
sp = sp->alias;
alloc_rrs_jmpslot(sp);
alloc_rrs_jmpslot(entry, sp);
} else if (RELOC_BASEREL_P(reloc)) {
lsp = &entry->symbols[reloc->r_symbolnum];
alloc_rrs_gotslot(reloc, lsp);
alloc_rrs_gotslot(entry, reloc, lsp);
} else if (RELOC_EXTERN_P(reloc)) {
@ -1778,7 +1853,7 @@ consider_relocation (entry, dataseg)
*/
if (building_shared_object) {
alloc_rrs_reloc(sp);
alloc_rrs_reloc(entry, sp);
continue;
}
@ -1795,20 +1870,27 @@ consider_relocation (entry, dataseg)
sp->so_defined == N_TEXT + N_EXT) {
/* Call to shared library procedure */
alloc_rrs_jmpslot(sp);
alloc_rrs_jmpslot(entry, sp);
#define EXPERIMENTAL
#ifdef EXPERIMENTAL
if (!RELOC_PCREL_P(reloc)) {
#ifdef DEBUG
printf("%s: FUNC flag set\n", sp->name);
#endif
sp->aux = RRS_FUNC;
}
#endif
} else if (sp->size &&
(sp->so_defined == N_DATA + N_EXT ||
sp->so_defined == N_TEXT + N_EXT)) {
/* Reference to shared library data */
alloc_rrs_cpy_reloc(sp);
alloc_rrs_cpy_reloc(entry, sp);
sp->defined = N_SIZE;
} else if (!sp->defined && sp->max_common_size == 0)
alloc_rrs_reloc(sp);
alloc_rrs_reloc(entry, sp);
} else {
/*
@ -1817,7 +1899,7 @@ consider_relocation (entry, dataseg)
* address dependent.
*/
if (building_shared_object) {
alloc_rrs_segment_reloc(reloc);
alloc_rrs_segment_reloc(entry, reloc);
}
}
}
@ -1849,13 +1931,15 @@ consider_file_section_lengths (entry)
/*
* Determine where the sections of ENTRY go into the output file,
* whose total section sizes are already known.
* Also relocate the addresses of the file's local and debugger symbols.
* Also relocate the addresses of the file's local and debugger symbols
* and determine which of the local symbols will make it into the
* output symbol table.
*/
void
relocate_file_addresses (entry)
register struct file_entry *entry;
{
register struct localsymbol *lsp, *lspend;
register struct localsymbol *lsp, *lspend;
entry->text_start_address += text_start;
/*
@ -1874,13 +1958,14 @@ printf("%s: datastart: %#x, bss %#x\n", get_file_name(entry),
for (lsp = entry->symbols; lsp < lspend; lsp++) {
register struct nlist *p = &lsp->nzlist.nlist;
register int type = p->n_type;
/*
* If this belongs to a section, update it
* by the section's start address
*/
register int type = p->n_type & N_TYPE;
switch (type) {
switch (type & N_TYPE) {
case N_TEXT:
case N_SETT:
p->n_value += entry->text_start_address;
@ -1904,7 +1989,54 @@ printf("%s: datastart: %#x, bss %#x\n", get_file_name(entry),
- entry->header.a_text - entry->header.a_data;
break;
}
/*
* See if this symbol should be in the output symbol table.
*/
if (type == N_WARNING)
continue;
if (SET_ELEMENT_P (type)) {
/*
* This occurs even if global. These types of
* symbols are never written globally, though
* they are stored globally.
*/
lsp->write = relocatable_output;
} else if (!(type & (N_STAB | N_EXT))) {
/*
* Ordinary local symbol
*/
lsp->write = (lsp->rename || (
discard_locals != DISCARD_ALL &&
!(discard_locals == DISCARD_L &&
lsp->is_L_symbol)));
if (lsp->write)
local_sym_count++;
} else if (!(type & N_EXT)) {
/*
* Debugger symbol
*/
lsp->write = (strip_symbols == STRIP_NONE);
if (lsp->write)
debugger_sym_count++;
}
}
/*
* Count one for the local symbol that we generate,
* whose name is the file's name (usually) and whose address
* is the start of the file's text.
*/
if (discard_locals != DISCARD_ALL)
local_sym_count++;
}
/* Write the output file */
@ -1973,33 +2105,19 @@ write_header ()
if (strip_symbols == STRIP_ALL)
nsyms = 0;
else {
nsyms = (defined_global_sym_count + undefined_global_sym_count);
if (discard_locals == DISCARD_L)
nsyms += non_L_local_sym_count;
else if (discard_locals == DISCARD_NONE)
nsyms += local_sym_count;
else
nsyms = global_sym_count + local_sym_count + debugger_sym_count;
if (relocatable_output)
/* For each alias we write out two struct nlists */
nsyms += set_symbol_count + global_alias_count;
if (relocatable_output)
nsyms += set_symbol_count;
if (dynamic_symbol->referenced)
nsyms++, special_sym_count++;
if (got_symbol->referenced)
nsyms++, special_sym_count++;
}
if (strip_symbols == STRIP_NONE)
nsyms += debugger_sym_count;
#ifdef DEBUG
printf("defined globals: %d, undefined globals %d, locals: %d (non_L: %d), \
debug symbols: %d, special: %d, set_symbols %d, aliases %d --> nsyms %d\n",
printf("global symbols %d (defined %d, undefined %d), locals: %d, \
debug symbols: %d, set_symbols %d, aliases %d --> nsyms %d\n",
global_sym_count,
defined_global_sym_count, undefined_global_sym_count,
local_sym_count, non_L_local_sym_count, debugger_sym_count,
special_sym_count, set_symbol_count, global_alias_count, nsyms);
local_sym_count, debugger_sym_count,
set_symbol_count, global_alias_count, nsyms);
#ifdef DEBUG
#endif
outheader.a_syms = nsyms * sizeof (struct nlist);
@ -2213,7 +2331,7 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
data_relocation - text_relocation;
} else
relocation = addend +
claim_rrs_jmpslot(r, sp, addend);
claim_rrs_jmpslot(entry, r, sp, addend);
} else if (RELOC_BASEREL_P(r)) {
@ -2230,7 +2348,8 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
relocation = claim_rrs_internal_gotslot(entry,
r, lsp, addend);
else
relocation = claim_rrs_gotslot(r, lsp, addend);
relocation = claim_rrs_gotslot(entry,
r, lsp, addend);
} else if (RELOC_EXTERN_P(r)) {
@ -2246,7 +2365,13 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
sp = sp->alias;
if (relocatable_output) {
relocation = addend + sp->value;
relocation = addend;
/*
* In PIC code, we keep the reference to the
* external symbol, even if defined now.
*/
if (!pic_code_seen)
relocation += sp->value;
} else if (sp->defined) {
if (sp == got_symbol) {
/* Handle _GOT_ refs */
@ -2262,7 +2387,8 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
entry->data_start_address:
entry->text_start_address;
relocation = addend;
if (claim_rrs_reloc(r, sp, &relocation))
if (claim_rrs_reloc(entry, r,
sp, &relocation))
continue;
} else if (sp->defined == N_SIZE) {
/*
@ -2275,7 +2401,7 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
relocation = addend + sp->value;
r->r_address = sp->value;
claim_rrs_cpy_reloc(r, sp);
claim_rrs_cpy_reloc(entry, r, sp);
} else
/* Plain old relocation */
relocation = addend + sp->value;
@ -2305,7 +2431,8 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
goto undefined;
relocation = addend +
claim_rrs_jmpslot(r, sp, addend);
claim_rrs_jmpslot(entry, r,
sp, addend);
break;
case N_DATA+N_EXT:
@ -2316,7 +2443,8 @@ perform_relocation(data, data_size, reloc, nreloc, entry, dataseg)
entry->data_start_address:
entry->text_start_address;
relocation = addend;
if (claim_rrs_reloc(r, sp, &relocation))
if (claim_rrs_reloc(entry, r,
sp, &relocation))
continue;
break;
@ -2382,7 +2510,7 @@ printf("%s: BSS found in so_defined\n", sp->name);
r->r_address += dataseg?
entry->data_start_address:
entry->text_start_address;
claim_rrs_segment_reloc(r);
claim_rrs_segment_reloc(entry, r);
}
}
@ -2421,13 +2549,14 @@ write_rel ()
FOR_EACH_SYMBOL(i, sp) {
if (sp != dynamic_symbol && sp->referenced) {
sp->symbolnum = count++;
if (sp->size)
count++;
if (sp->alias)
count++;
}
} END_EACH_SYMBOL;
/* Correct, because if (relocatable_output), we will also be writing
whatever indirect blocks we have. */
if (count != defined_global_sym_count + undefined_global_sym_count
+ special_sym_count)
if (count != global_sym_count)
fatal ("internal error: write_rel: count = %d", count);
each_full_file (assign_symbolnums, &count);
@ -2457,8 +2586,13 @@ assign_symbolnums(entry, countp)
lspend = entry->symbols + entry->nsymbols;
if (discard_locals != DISCARD_ALL)
/* Count the N_FN symbol for this entry */
n++;
for (lsp = entry->symbols; lsp < lspend; lsp++) {
lsp->symbolnum = n++;
if (lsp->write)
lsp->symbolnum = n++;
}
*countp = n;
}
@ -2474,21 +2608,29 @@ coptxtrel(entry)
end = r + entry->ntextrel;
for (; r < end; r++) {
register int symindex;
symbol *sp;
register int symindex;
struct localsymbol *lsp;
symbol *sp;
RELOC_ADDRESS(r) += reloc;
if (!RELOC_EXTERN_P(r))
continue;
symindex = RELOC_SYMBOL(r);
sp = entry->symbols[symindex].symbol;
lsp = &entry->symbols[symindex];
if (!RELOC_EXTERN_P(r)) {
if (!pic_code_seen)
continue;
if (RELOC_BASEREL_P(r))
RELOC_SYMBOL(r) = lsp->symbolnum;
continue;
}
if (symindex >= entry->nsymbols)
fatal_with_file(
"relocation symbolnum out of range in ", entry);
sp = lsp->symbol;
#ifdef N_INDR
/* Resolve indirection. */
if ((sp->defined & ~N_EXT) == N_INDR) {
@ -2504,8 +2646,11 @@ coptxtrel(entry)
*/
if (sp->defined) {
RELOC_EXTERN_P(r) = 0;
RELOC_SYMBOL(r) = (sp->defined & N_TYPE);
if (!pic_code_seen) {
RELOC_EXTERN_P(r) = 0;
RELOC_SYMBOL(r) = (sp->defined & N_TYPE);
} else
RELOC_SYMBOL(r) = sp->symbolnum;
#ifdef RELOC_ADD_EXTRA
/*
* If we aren't going to be adding in the
@ -2550,8 +2695,13 @@ copdatrel(entry)
RELOC_ADDRESS(r) += reloc;
if (!RELOC_EXTERN_P(r))
if (!RELOC_EXTERN_P(r)) {
if (RELOC_BASEREL_P(r))
fatal_with_file(
"Unsupported relocation type in ",
entry);
continue;
}
symindex = RELOC_SYMBOL(r);
sp = entry->symbols[symindex].symbol;
@ -2571,10 +2721,10 @@ copdatrel(entry)
symtype = sp->defined & N_TYPE;
if (force_common_definition ||
if (!pic_code_seen && (force_common_definition ||
symtype == N_DATA ||
symtype == N_TEXT ||
symtype == N_ABS) {
symtype == N_ABS)) {
RELOC_EXTERN_P(r) = 0;
RELOC_SYMBOL(r) = symtype;
} else
@ -2589,8 +2739,8 @@ copdatrel(entry)
sizeof(struct relocation_info), outdesc);
}
void write_file_syms ();
void write_string_table ();
void write_file_syms __P((struct file_entry *, int *));
void write_string_table __P((void));
/* Offsets and current lengths of symbol and string tables in output file. */
@ -2672,10 +2822,6 @@ void
write_syms()
{
/* Number of symbols written so far. */
int non_local_syms = defined_global_sym_count
+ undefined_global_sym_count
+ global_alias_count
+ special_sym_count;
int syms_written = 0;
struct nlist nl;
@ -2683,8 +2829,8 @@ write_syms()
* Buffer big enough for all the global symbols. One extra struct
* for each indirect symbol to hold the extra reference following.
*/
struct nlist *buf
= (struct nlist *)alloca(non_local_syms * sizeof(struct nlist));
struct nlist *buf = (struct nlist *)
alloca(global_sym_count * sizeof(struct nlist));
/* Pointer for storing into BUF. */
register struct nlist *bufp = buf;
@ -2707,8 +2853,8 @@ write_syms()
* extra space for the references following indirect outputs.
*/
strtab_vector = (char **) alloca((non_local_syms) * sizeof(char *));
strtab_lens = (int *) alloca((non_local_syms) * sizeof(int));
strtab_vector = (char **) alloca((global_sym_count) * sizeof(char *));
strtab_lens = (int *) alloca((global_sym_count) * sizeof(int));
strtab_index = 0;
/*
@ -2817,10 +2963,10 @@ write_syms()
/* Output to the buffer and count it. */
if (syms_written >= non_local_syms)
if (syms_written >= global_sym_count)
fatal(
"internal error: number of symbols exceeds allocated %d",
non_local_syms);
global_sym_count);
*bufp++ = nl;
syms_written++;
@ -2831,6 +2977,18 @@ write_syms()
nl.n_un.n_strx =
assign_string_table_index(sp->alias->name);
nl.n_value = 0;
nl.n_other = 0;
nl.n_desc = 0;
*bufp++ = nl;
syms_written++;
}
if (relocatable_output && sp->size) {
nl.n_type = N_SIZE + N_EXT;
nl.n_un.n_strx = assign_string_table_index(sp->name);
nl.n_value = sp->size;
nl.n_other = 0;
nl.n_desc = 0;
*bufp++ = nl;
syms_written++;
}
@ -2840,10 +2998,10 @@ printf("writesym(#%d): %s, type %x\n", syms_written, sp->name, sp->defined);
#endif
} END_EACH_SYMBOL;
if (syms_written != strtab_index || strtab_index != non_local_syms)
if (syms_written != strtab_index || strtab_index != global_sym_count)
fatal("internal error:\
wrong number (%d) of global symbols written into output file, should be %d",
syms_written, non_local_syms);
syms_written, global_sym_count);
/* Output the buffer full of `struct nlist's. */
@ -2927,7 +3085,9 @@ write_file_syms(entry, syms_written_addr)
nl.n_other = 0;
*bufp++ = nl;
(*syms_written_addr)++;
#if 0
entry->local_syms_offset = *syms_written_addr * sizeof(struct nlist);
#endif
}
/* Read the file's string table. */
@ -2942,6 +3102,9 @@ write_file_syms(entry, syms_written_addr)
register int write = 0;
char *name;
if (! lsp->write)
continue;
if (p->n_un.n_strx == 0)
name = NULL;
else if (lsp->rename == 0)
@ -2952,49 +3115,20 @@ write_file_syms(entry, syms_written_addr)
strlen(entry->local_sym_name) +
strlen(cp) + 2 );
(void)sprintf(name, "%s.%s", entry->local_sym_name, cp);
(void)printf("%s.%s\n", entry->local_sym_name, cp);
}
/*
* WRITE gets 1 for a non-global symbol that should be
* written.
* If this symbol has a name, allocate space for it
* in the output string table.
*/
if (SET_ELEMENT_P (type))
/*
* This occurs even if global. These types of
* symbols are never written globally, though
* they are stored globally.
*/
write = relocatable_output;
else if (!(type & (N_STAB | N_EXT)) && name != NULL)
/* ordinary local symbol */
write = (lsp->rename || (
discard_locals != DISCARD_ALL &&
!(discard_locals == DISCARD_L &&
name[0] == LPREFIX) &&
type != N_WARNING) );
else if (!(type & N_EXT))
/* debugger symbol */
write = (strip_symbols == STRIP_NONE)/* &&
!(discard_locals == DISCARD_L &&
name[0] == LPREFIX)*/;
else if (name == NULL)
error("Amnesiac");
if (write) {
/*
* If this symbol has a name, allocate space for it
* in the output string table.
*/
if (name)
p->n_un.n_strx = assign_string_table_index(name);
if (name)
p->n_un.n_strx = assign_string_table_index(name);
/* Output this symbol to the buffer and count it. */
/* Output this symbol to the buffer and count it. */
*bufp++ = *p;
(*syms_written_addr)++;
}
*bufp++ = *p;
(*syms_written_addr)++;
}
/* All the symbols are now in BUF; write them. */

View file

@ -1,4 +1,4 @@
/* $Id: ld.h,v 1.3 1993/11/18 20:52:34 jkh Exp $ */
/* $Id: ld.h,v 1.5 1993/11/10 21:53:42 pk Exp $ */
/*-
* This code is derived from software copyrighted by the Free Software
* Foundation.
@ -470,6 +470,12 @@ symbol *symtab[TABSIZE];
/* Number of symbols in symbol hash table. */
int num_hash_tab_syms;
/* Count number of nlist entries for global symbols */
int global_sym_count;
/* Count number of N_SIZE nlist entries for output (relocatable_output only) */
int size_sym_count;
/* Count the number of nlist entries that are for local symbols.
This count and the three following counts
are incremented as as symbols are entered in the symbol table. */
@ -583,8 +589,10 @@ struct file_entry {
/* The file's a.out header. */
struct exec header;
#if 0
/* Offset in file of GDB symbol segment, or 0 if there is none. */
int symseg_offset;
#endif
/* Describe data from the file loaded into core */
@ -600,6 +608,8 @@ struct file_entry {
struct localsymbol *next;
long gotslot_offset;
char gotslot_claimed;
char write;
char is_L_symbol;
char rename;
int symbolnum;
} *symbols;
@ -640,11 +650,13 @@ struct file_entry {
/* Start of this file's bss seg in the output file core image. */
int bss_start_address;
#if 0
/*
* Offset in bytes in the output file symbol table of the first local
* symbol for this file. Set by `write_file_symbols'.
*/
int local_syms_offset;
#endif
/* For library members only */
@ -666,6 +678,11 @@ struct file_entry {
/* For library member, points to next entry for next member. */
struct file_entry *chain;
#ifdef SUN_COMPAT
/* For shared libraries which have a .sa companion */
struct file_entry *silly_archive;
#endif
/* 1 if file is a library. */
char library_flag;
@ -710,7 +727,8 @@ int number_of_files;
#define FORCEARCHIVE 4 /* Force inclusion of all members
of archives */
#define SHAREABLE 8 /* Build a shared object */
int link_mode;
#define SILLYARCHIVE 16 /* Process .sa companions, if any */
int link_mode;
/*
* Runtime Relocation Section (RRS).
@ -857,18 +875,25 @@ void read_shared_object __P((int, struct file_entry *));
int findlib __P((struct file_entry *));
/* In shlib.c: */
char *findshlib __P((char *, int *, int *));
char *findshlib __P((char *, int *, int *, int));
void add_search_dir __P((char *));
void std_search_dirs __P((char *));
/* In rrs.c: */
void init_rrs __P((void));
int rrs_add_shobj __P((struct file_entry *));
void alloc_rrs_reloc __P((symbol *));
void alloc_rrs_segment_reloc __P((struct relocation_info *));
void alloc_rrs_jmpslot __P((symbol *));
void alloc_rrs_gotslot __P((struct relocation_info *, localsymbol_t *));
void alloc_rrs_copy_reloc __P((symbol *));
void alloc_rrs_reloc __P((struct file_entry *, symbol *));
void alloc_rrs_segment_reloc __P((struct file_entry *, struct relocation_info *));
void alloc_rrs_jmpslot __P((struct file_entry *, symbol *));
void alloc_rrs_gotslot __P((struct file_entry *, struct relocation_info *, localsymbol_t *));
void alloc_rrs_cpy_reloc __P((struct file_entry *, symbol *));
int claim_rrs_reloc __P((struct file_entry *, struct relocation_info *, symbol *, long *));
long claim_rrs_jmpslot __P((struct file_entry *, struct relocation_info *, symbol *, long));
long claim_rrs_gotslot __P((struct file_entry *, struct relocation_info *, struct localsymbol *, long));
long claim_rrs_internal_gotslot __P((struct file_entry *, struct relocation_info *, struct localsymbol *, long));
void claim_rrs_cpy_reloc __P((struct file_entry *, struct relocation_info *, symbol *));
void claim_rrs_segment_reloc __P((struct file_entry *, struct relocation_info *));
/* In <md>.c */
void md_init_header __P((struct exec *, int, int));

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: ldconfig.c,v 1.1 1993/10/23 00:17:03 pk Exp $
* $Id: ldconfig.c,v 1.2 1993/11/09 04:19:22 paul Exp $
*/
#include <sys/param.h>
@ -58,7 +58,6 @@ static int verbose;
static int nostd;
static int justread;
#define MAXDEWEY 8
struct shlib_list {
/* Internal list of shared libraries found */
char *name;
@ -401,9 +400,13 @@ listhints()
return -1;
}
printf("\t-l%s.%d.%d => %s\n",
printf("\t%d:-l%s.%d.%d => %s (%d -> %d)\n",
i,
strtab + bp->hi_namex, bp->hi_major, bp->hi_minor,
strtab + bp->hi_pathx);
strtab + bp->hi_pathx,
hinthash(strtab+bp->hi_namex, bp->hi_major, bp->hi_minor)
% hdr->hh_nbucket,
bp->hi_next);
}
return 0;

View file

@ -1,5 +1,5 @@
/*
* $Id: lib.c,v 1.2 1993/11/09 04:19:00 paul Exp $ - library routines
* $Id: lib.c,v 1.3 1993/11/22 19:04:43 jkh Exp $ - library routines
*/
#include <sys/param.h>
@ -573,6 +573,8 @@ read_shared_object (desc, entry)
entry->symbols[i].next = NULL;
entry->symbols[i].gotslot_offset = -1;
entry->symbols[i].gotslot_claimed = 0;
entry->symbols[i].write = 0;
entry->symbols[i].is_L_symbol = 0;
entry->symbols[i].rename = 0;
}
@ -588,9 +590,109 @@ read_shared_object (desc, entry)
enter_file_symbols (entry);
entry->strings = 0;
/* TODO: examine needed shared objects */
/*
* Load any subsidiary shared objects.
*/
if (dyn2.ld_need) {
struct link_object lobj;
off_t offset;
struct file_entry *subentry, *prev = NULL;
subentry = (struct file_entry *)
xmalloc(sizeof(struct file_entry));
bzero(subentry, sizeof(struct file_entry));
subentry->superfile = entry;
offset = (off_t)dyn2.ld_need;
while (1) {
char *libname, name[MAXPATHLEN]; /*XXX*/
lseek(desc, offset, L_SET);
if (read(desc, &lobj, sizeof(lobj)) != sizeof(lobj)) {
fatal_with_file(
"premature eof while reading link objects ",
entry);
}
md_swapin_link_object(&lobj, 1);
(void)lseek(desc, (off_t)lobj.lo_name, L_SET);
(void)read(desc, name, sizeof(name));
if (lobj.lo_library) {
int lo_major = lobj.lo_major;
int lo_minor = lobj.lo_minor;
libname = findshlib(name,
&lo_major, &lo_minor, 0);
if (libname == NULL)
fatal("no shared -l%s.%d.%d available",
name, lobj.lo_major, lobj.lo_minor);
subentry->filename = libname;
subentry->local_sym_name = concat("-l", name, "");
} else {
subentry->filename = strdup(name);
subentry->local_sym_name = strdup(name);
}
read_file_symbols(subentry);
if (prev)
prev->chain = subentry;
else
entry->subfiles = subentry;
prev = subentry;
file_open(entry);
if ((offset = (off_t)lobj.lo_next) == 0)
break;
}
}
#ifdef SUN_COMPAT
if (link_mode & SILLYARCHIVE) {
char *cp, *sa_name;
char armag[SARMAG];
int fd;
struct file_entry *subentry;
sa_name = strdup(entry->filename);
if (sa_name == NULL)
goto out;
cp = sa_name + strlen(sa_name) - 1;
while (cp > sa_name) {
if (!isdigit(*cp) && *cp != '.')
break;
--cp;
}
if (cp <= sa_name || *cp != 'o') {
/* Not in `libxxx.so.n.m' form */
free(sa_name);
goto out;
}
*cp = 'a';
if ((fd = open(sa_name, O_RDONLY, 0)) < 0)
goto out;
/* Read archive magic */
bzero(armag, SARMAG);
(void)read(fd, armag, SARMAG);
(void)close(fd);
if (strncmp(armag, ARMAG, SARMAG) != 0) {
error("%s: malformed silly archive",
get_file_name(entry));
goto out;
}
subentry = (struct file_entry *)
xmalloc(sizeof(struct file_entry));
bzero(subentry, sizeof(struct file_entry));
entry->silly_archive = subentry;
subentry->superfile = entry;
subentry->filename = sa_name;
subentry->local_sym_name = sa_name;
subentry->library_flag = 1;
search_library(file_open(subentry), subentry);
out:
}
#endif
}
#undef major
@ -609,7 +711,7 @@ struct file_entry *p;
if (p->search_dynamic_flag == 0)
goto dot_a;
fname = findshlib(p->filename, &major, &minor);
fname = findshlib(p->filename, &major, &minor, 1);
if (fname && (desc = open (fname, O_RDONLY, 0)) > 0) {
p->filename = fname;

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: rrs.c,v 1.3 1993/11/17 01:33:24 ache Exp $
* $Id: rrs.c,v 1.4 1993/11/22 19:04:44 jkh Exp $
*/
#include <sys/param.h>
@ -180,27 +180,31 @@ struct file_entry *entry;
}
void
alloc_rrs_reloc(sp)
alloc_rrs_reloc(entry, sp)
struct file_entry *entry;
symbol *sp;
{
#ifdef DEBUG
printf("alloc_rrs_reloc: %s\n", sp->name);
printf("alloc_rrs_reloc: %s in %s\n", sp->name, get_file_name(entry));
#endif
reserved_rrs_relocs++;
}
void
alloc_rrs_segment_reloc(r)
alloc_rrs_segment_reloc(entry, r)
struct file_entry *entry;
struct relocation_info *r;
{
#ifdef DEBUG
printf("alloc_rrs_segment_reloc at %#x\n", r->r_address);
printf("alloc_rrs_segment_reloc at %#x in %s\n",
r->r_address, get_file_name(entry));
#endif
reserved_rrs_relocs++;
}
void
alloc_rrs_jmpslot(sp)
alloc_rrs_jmpslot(entry, sp)
struct file_entry *entry;
symbol *sp;
{
if (sp->jmpslot_offset == -1) {
@ -214,7 +218,8 @@ symbol *sp;
}
void
alloc_rrs_gotslot(r, lsp)
alloc_rrs_gotslot(entry, r, lsp)
struct file_entry *entry;
struct relocation_info *r;
struct localsymbol *lsp;
{
@ -222,8 +227,11 @@ struct localsymbol *lsp;
if (!RELOC_EXTERN_P(r)) {
if (sp != NULL)
fatal("internal error: lsp->symbol not NULL");
if (sp != NULL) {
error("%s: relocation for internal symbol expected at %#x",
get_file_name(entry), RELOC_ADDRESS(r));
return;
}
if (!RELOC_STATICS_THROUGH_GOT_P(r))
/* No need for a GOT slot */
@ -242,11 +250,20 @@ struct localsymbol *lsp;
reserved_rrs_relocs++;
}
} else if (sp->gotslot_offset == -1) {
} else {
if (sp == NULL) {
error("%s: relocation must refer to global symbol at %#x",
get_file_name(entry), RELOC_ADDRESS(r));
return;
}
if (sp->alias)
sp = sp->alias;
if (sp->gotslot_offset != -1)
return;
/*
* External symbols always get a relocation entry
*/
@ -259,13 +276,14 @@ struct localsymbol *lsp;
}
void
alloc_rrs_cpy_reloc(sp)
alloc_rrs_cpy_reloc(entry, sp)
struct file_entry *entry;
symbol *sp;
{
if (sp->cpyreloc_reserved)
return;
#ifdef DEBUG
printf("alloc_rrs_copy: %s\n", sp->name);
printf("alloc_rrs_copy: %s in %s\n", sp->name, get_file_name(entry));
#endif
sp->cpyreloc_reserved = 1;
reserved_rrs_relocs++;
@ -292,7 +310,8 @@ rrs_next_reloc()
* written to a.out.
*/
int
claim_rrs_reloc(rp, sp, relocation)
claim_rrs_reloc(entry, rp, sp, relocation)
struct file_entry *entry;
struct relocation_info *rp;
symbol *sp;
long *relocation;
@ -300,18 +319,19 @@ long *relocation;
struct relocation_info *r = rrs_next_reloc();
if (rp->r_address < text_start + text_size)
error("RRS text relocation at %#x (symbol %s)",
rp->r_address, sp->name);
error("%s: RRS text relocation at %#x for \"%s\"",
get_file_name(entry), rp->r_address, sp->name);
#ifdef DEBUG
printf("claim_rrs_reloc: %s\n", sp->name);
printf("claim_rrs_reloc: %s in %s\n", sp->name, get_file_name(entry));
#endif
r->r_address = rp->r_address;
r->r_symbolnum = sp->rrs_symbolnum;
if (link_mode & SYMBOLIC) {
if (!sp->defined)
error("Cannot reduce symbol %s", sp->name);
error("Cannot reduce symbol \"%s\" in %s",
sp->name, get_file_name(entry));
RELOC_EXTERN_P(r) = 0;
*relocation += sp->value;
(void) md_make_reloc(rp, r, RELTYPE_RELATIVE);
@ -326,7 +346,8 @@ printf("claim_rrs_reloc: %s\n", sp->name);
* Claim a jmpslot. Setup RRS relocation if claimed for the first time.
*/
long
claim_rrs_jmpslot(rp, sp, addend)
claim_rrs_jmpslot(entry, rp, sp, addend)
struct file_entry *entry;
struct relocation_info *rp;
symbol *sp;
long addend;
@ -337,18 +358,21 @@ long addend;
return rrs_dyn2.ld_plt + sp->jmpslot_offset;
#ifdef DEBUG
printf("claim_rrs_jmpslot: %s(%d) -> offset %x (textreloc %#x)\n",
printf("claim_rrs_jmpslot: %s: %s(%d) -> offset %x (textreloc %#x)\n",
get_file_name(entry),
sp->name, sp->rrs_symbolnum, sp->jmpslot_offset, text_relocation);
#endif
if (sp->jmpslot_offset == -1)
fatal(
"internal error: claim_rrs_jmpslot: %s: jmpslot_offset == -1\n",
"internal error: %s: claim_rrs_jmpslot: %s: jmpslot_offset == -1\n",
get_file_name(entry),
sp->name);
if ((link_mode & SYMBOLIC) || rrs_section_type == RRS_PARTIAL) {
if (!sp->defined)
error("Cannot reduce symbol %s", sp->name);
error("Cannot reduce symbol \"%s\" in %s",
sp->name, get_file_name(entry));
md_fix_jmpslot( rrs_plt + sp->jmpslot_offset/sizeof(jmpslot_t),
rrs_dyn2.ld_plt + sp->jmpslot_offset,
@ -393,7 +417,8 @@ printf("claim_rrs_jmpslot: %s(%d) -> offset %x (textreloc %#x)\n",
* Return offset into the GOT allocated to this symbol.
*/
long
claim_rrs_gotslot(rp, lsp, addend)
claim_rrs_gotslot(entry, rp, lsp, addend)
struct file_entry *entry;
struct relocation_info *rp;
struct localsymbol *lsp;
long addend;
@ -402,6 +427,10 @@ long addend;
symbol *sp = lsp->symbol;
int reloc_type = 0;
if (sp == NULL) {
return 0;
}
if (sp->alias)
sp = sp->alias;
@ -411,8 +440,8 @@ printf("claim_rrs_gotslot: %s(%d) slot offset %#x, addend %#x\n",
#endif
if (sp->gotslot_offset == -1)
fatal(
"internal error: claim_rrs_gotslot: %s: gotslot_offset == -1\n",
sp->name);
"internal error: %s: claim_rrs_gotslot: %s: gotslot_offset == -1\n",
get_file_name(entry), sp->name);
if (sp->gotslot_claimed)
/* This symbol already passed here before. */
@ -435,7 +464,8 @@ printf("claim_rrs_gotslot: %s(%d) slot offset %#x, addend %#x\n",
* RRS_PARTIAL: we don't link against shared objects,
* so again all symbols must be known.
*/
error("Cannot reduce symbol %s", sp->name);
error("Cannot reduce symbol \"%s\" in %s",
sp->name, get_file_name(entry));
} else {
@ -453,7 +483,8 @@ printf("claim_rrs_gotslot: %s(%d) slot offset %#x, addend %#x\n",
* NOTE: RRS_PARTIAL implies !SHAREABLE.
*/
if (!sp->defined)
error("Cannot reduce symbol %s", sp->name);
error("Cannot reduce symbol \"%s\" in %s",
sp->name, get_file_name(entry));
return sp->gotslot_offset;
}
@ -496,13 +527,14 @@ long addend;
return addend - rrs_dyn2.ld_got;
#ifdef DEBUG
printf("claim_rrsinternal__gotslot: slot offset %#x, addend = %#x\n",
lsp->gotslot_offset, addend);
printf("claim_rrs_internal_gotslot: %s: slot offset %#x, addend = %#x\n",
get_file_name(entry), lsp->gotslot_offset, addend);
#endif
if (lsp->gotslot_offset == -1)
fatal(
"internal error: claim_rrs_internal_gotslot: slot_offset == -1\n");
"internal error: %s: claim_rrs_internal_gotslot at %#x: slot_offset == -1\n",
get_file_name(entry), RELOC_ADDRESS(rp));
if (lsp->gotslot_claimed)
/* Already done */
@ -525,7 +557,8 @@ printf("claim_rrsinternal__gotslot: slot offset %#x, addend = %#x\n",
}
void
claim_rrs_cpy_reloc(rp, sp)
claim_rrs_cpy_reloc(entry, rp, sp)
struct file_entry *entry;
struct relocation_info *rp;
symbol *sp;
{
@ -535,11 +568,12 @@ symbol *sp;
return;
if (!sp->cpyreloc_reserved)
fatal("internal error: claim_cpy_reloc: %s: no reservation\n",
sp->name);
fatal("internal error: %s: claim_cpy_reloc: %s: no reservation\n",
get_file_name(entry), sp->name);
#ifdef DEBUG
printf("claim_rrs_copy: %s -> %x\n", sp->name, sp->so_defined);
printf("claim_rrs_copy: %s: %s -> %x\n",
get_file_name(entry), sp->name, sp->so_defined);
#endif
r = rrs_next_reloc();
@ -551,13 +585,15 @@ printf("claim_rrs_copy: %s -> %x\n", sp->name, sp->so_defined);
}
void
claim_rrs_segment_reloc(rp)
claim_rrs_segment_reloc(entry, rp)
struct file_entry *entry;
struct relocation_info *rp;
{
struct relocation_info *r = rrs_next_reloc();
#ifdef DEBUG
printf("claim_rrs_segment_reloc: %x\n", rp->r_address);
printf("claim_rrs_segment_reloc: %s at %#x\n",
get_file_name(entry), rp->r_address);
#endif
r->r_address = rp->r_address;
RELOC_TYPE(r) = RELOC_TYPE(rp);
@ -1023,8 +1059,9 @@ write_rrs_text()
for (i = 0, shp = rrs_shobjs; shp; i++, shp = shp->next) {
char *name = shp->entry->local_sym_name;
if (shp == NULL)
fatal("internal error: shp == NULL");
if (i >= number_of_shobjs)
fatal("internal error: # of link objects exceeds %d",
number_of_shobjs);
lo[i].lo_name = pos;
lo[i].lo_major = shp->entry->lib_major;
@ -1039,10 +1076,11 @@ write_rrs_text()
pos += 1 + strlen(name);
lo[i].lo_next = (i == number_of_shobjs - 1) ? 0 :
(rrs_dyn2.ld_need + (i+1)*sizeof(struct link_object));
}
if (shp != NULL)
fatal("internal error: shp != NULL");
if (i < number_of_shobjs)
fatal("internal error: # of link objects less then expected %d",
number_of_shobjs);
md_swapout_link_object(lo, number_of_shobjs);
mywrite(lo, number_of_shobjs, sizeof(struct link_object), outdesc);

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: rtld.c,v 1.3 1993/11/09 04:44:30 paul Exp $
* $Id: rtld.c,v 1.4 1993/11/22 19:05:27 jkh Exp $
*/
#include <machine/vmparam.h>
@ -240,6 +240,9 @@ struct link_dynamic *dp;
if (link_map_head)
ldp->ldd_sym_loaded = 1;
}
/* Close our file descriptor */
(void)close(crtp->crt_ldfd);
}
@ -1055,6 +1058,63 @@ xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
if (mmap(curbrk, incr,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_FIXED|MAP_COPY, fd, 0) == (caddr_t)-1) {
xprintf("Cannot map anonymous memory");
_exit(1);
}
#ifdef NEED_DEV_ZERO
close(fd);
#endif
oldbrk = curbrk;
#if TRY_THIS_FOR_A_CHANGE
curbrk -= incr;
#else
curbrk += incr;
#endif
return oldbrk;
}
#else
caddr_t
sbrk(incr)
int incr;
{
int fd = -1;
caddr_t oldbrk;
xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
#if DEBUG
xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
#endif
if (curbrk == 0 && (curbrk = mmap(0, PAGSIZ,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_COPY, fd, 0)) == (caddr_t)-1) {
xprintf("Cannot map anonymous memory");
_exit(1);
}
/* There's valid memory from `curbrk' to next page boundary */
if ((long)curbrk + incr <= (((long)curbrk + PAGSIZ) & ~(PAGSIZ - 1))) {
oldbrk = curbrk;
curbrk += incr;
return oldbrk;
}
/*
* If asking for than currently left in this chunk,
* go somewhere completely different.
*/
#ifdef NEED_DEV_ZERO
fd = open("/dev/zero", O_RDWR, 0);
if (fd == -1)
perror("/dev/zero");
#endif
if ((curbrk = mmap(0, incr,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_COPY, fd, 0)) == (caddr_t)-1) {
perror("Cannot map anonymous memory");
}

View file

@ -1,5 +1,5 @@
/*
* $Id: shlib.c,v 1.4 1993/11/08 13:21:23 pk Exp $
* $Id: shlib.c,v 1.2 1993/11/09 04:19:03 paul Exp $
*/
#include <sys/param.h>
@ -132,9 +132,10 @@ int n1, n2;
#undef minor
char *
findshlib(name, majorp, minorp)
findshlib(name, majorp, minorp, do_dot_a)
char *name;
int *majorp, *minorp;
int do_dot_a;
{
int dewey[MAXDEWEY];
int ndewey;
@ -154,6 +155,7 @@ int *majorp, *minorp;
for (i = 0; i < n_search_dirs; i++) {
DIR *dd = opendir(search_dirs[i]);
struct dirent *dp;
int found_dot_a = 0;
if (dd == NULL)
continue;
@ -161,6 +163,16 @@ int *majorp, *minorp;
while ((dp = readdir(dd)) != NULL) {
int n, j, might_take_it = 0;
if (do_dot_a && path == NULL &&
dp->d_namlen == len + 2 &&
strncmp(dp->d_name, lname, len) == 0 &&
(dp->d_name+len)[0] == '.' &&
(dp->d_name+len)[1] == 'a') {
path = concat(search_dirs[i], "/", dp->d_name);
found_dot_a = 1;
}
if (dp->d_namlen < len + 4)
continue;
if (strncmp(dp->d_name, lname, len) != 0)
@ -171,6 +183,12 @@ int *majorp, *minorp;
if ((n = getdewey(tmp, dp->d_name+len+4)) == 0)
continue;
if (major != -1 && found_dot_a) { /* XXX */
free(path);
path = NULL;
found_dot_a = 0;
}
if (major == -1 && minor == -1) {
might_take_it = 1;
} else if (major != -1 && minor == -1) {
@ -192,12 +210,19 @@ int *majorp, *minorp;
if (path)
free(path);
path = concat(search_dirs[i], "/", dp->d_name);
found_dot_a = 0;
bcopy(tmp, dewey, sizeof(dewey));
ndewey = n;
*majorp = dewey[0];
*minorp = dewey[1];
}
closedir(dd);
if (found_dot_a)
/*
* There's a .a archive here.
*/
return path;
}
return path;

View file

@ -1,5 +1,5 @@
/*
* $Id: md.c,v 1.2 1993/11/09 04:19:33 paul Exp $
* $Id: md.c,v 1.3 1993/11/22 19:05:30 jkh Exp $
*/
#include <sys/param.h>
@ -291,6 +291,6 @@ long where;
long *savep;
{
*savep = *(long *)where;
*(long *)where = BPT;
*(long *)where = TRAP;
}

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: md.h,v 1.2 1993/11/09 04:19:35 paul Exp $
* $Id: md.h,v 1.3 1993/11/22 19:05:31 jkh Exp $
*/
/*
@ -122,7 +122,7 @@ typedef struct jmpslot {
#define CALL 0x40000000 /* Call instruction (opcode2) */
#define JMP 0x81c06000 /* Jump %g1 instruction (opcode2) */
#define NOP 0x01000000 /* Delay slot NOP for (reloc_index) */
#define BPT 0x91d02001 /* breakpoint: `ta 0x1' */
#define TRAP 0x91d02001 /* ta 0x1 */
/*

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: md.c,v 1.3 1993/11/15 20:58:20 paul Exp $
* $Id: md.c,v 1.4 1993/11/22 19:05:23 jkh Exp $
*/
#include <sys/param.h>
@ -242,7 +242,7 @@ long where;
long *savep;
{
*savep = *(long *)where;
*(char *)where = BPT;
*(char *)where = TRAP;
}
#ifdef NEED_SWAP

View file

@ -1,5 +1,5 @@
/*
* $Id: md.h,v 1.2 1993/11/09 04:19:17 paul Exp $ - I386 dependent definitions
* $Id: md.h,v 1.3 1993/11/22 19:05:24 jkh Exp $ - I386 dependent definitions
*/
@ -50,7 +50,7 @@ typedef struct jmpslot {
#define NOP 0x90
#define CALL 0xe890 /* NOP + CALL opcode */
#define JUMP 0xe990 /* NOP + JMP opcode */
#define BPT 0xcc /* breakpoint: INT 3 */
#define TRAP 0xcc /* INT 3 */
/*
* Byte swap defs for cross linking

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: rtld.c,v 1.3 1993/11/09 04:44:30 paul Exp $
* $Id: rtld.c,v 1.4 1993/11/22 19:05:27 jkh Exp $
*/
#include <machine/vmparam.h>
@ -240,6 +240,9 @@ struct link_dynamic *dp;
if (link_map_head)
ldp->ldd_sym_loaded = 1;
}
/* Close our file descriptor */
(void)close(crtp->crt_ldfd);
}
@ -1055,6 +1058,63 @@ xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
if (mmap(curbrk, incr,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_FIXED|MAP_COPY, fd, 0) == (caddr_t)-1) {
xprintf("Cannot map anonymous memory");
_exit(1);
}
#ifdef NEED_DEV_ZERO
close(fd);
#endif
oldbrk = curbrk;
#if TRY_THIS_FOR_A_CHANGE
curbrk -= incr;
#else
curbrk += incr;
#endif
return oldbrk;
}
#else
caddr_t
sbrk(incr)
int incr;
{
int fd = -1;
caddr_t oldbrk;
xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
#if DEBUG
xprintf("sbrk: incr = %#x, curbrk = %#x\n", incr, curbrk);
#endif
if (curbrk == 0 && (curbrk = mmap(0, PAGSIZ,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_COPY, fd, 0)) == (caddr_t)-1) {
xprintf("Cannot map anonymous memory");
_exit(1);
}
/* There's valid memory from `curbrk' to next page boundary */
if ((long)curbrk + incr <= (((long)curbrk + PAGSIZ) & ~(PAGSIZ - 1))) {
oldbrk = curbrk;
curbrk += incr;
return oldbrk;
}
/*
* If asking for than currently left in this chunk,
* go somewhere completely different.
*/
#ifdef NEED_DEV_ZERO
fd = open("/dev/zero", O_RDWR, 0);
if (fd == -1)
perror("/dev/zero");
#endif
if ((curbrk = mmap(0, incr,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_COPY, fd, 0)) == (caddr_t)-1) {
perror("Cannot map anonymous memory");
}

View file

@ -1,5 +1,5 @@
/*
* $Id: shlib.c,v 1.4 1993/11/08 13:21:23 pk Exp $
* $Id: shlib.c,v 1.2 1993/11/09 04:19:03 paul Exp $
*/
#include <sys/param.h>
@ -132,9 +132,10 @@ int n1, n2;
#undef minor
char *
findshlib(name, majorp, minorp)
findshlib(name, majorp, minorp, do_dot_a)
char *name;
int *majorp, *minorp;
int do_dot_a;
{
int dewey[MAXDEWEY];
int ndewey;
@ -154,6 +155,7 @@ int *majorp, *minorp;
for (i = 0; i < n_search_dirs; i++) {
DIR *dd = opendir(search_dirs[i]);
struct dirent *dp;
int found_dot_a = 0;
if (dd == NULL)
continue;
@ -161,6 +163,16 @@ int *majorp, *minorp;
while ((dp = readdir(dd)) != NULL) {
int n, j, might_take_it = 0;
if (do_dot_a && path == NULL &&
dp->d_namlen == len + 2 &&
strncmp(dp->d_name, lname, len) == 0 &&
(dp->d_name+len)[0] == '.' &&
(dp->d_name+len)[1] == 'a') {
path = concat(search_dirs[i], "/", dp->d_name);
found_dot_a = 1;
}
if (dp->d_namlen < len + 4)
continue;
if (strncmp(dp->d_name, lname, len) != 0)
@ -171,6 +183,12 @@ int *majorp, *minorp;
if ((n = getdewey(tmp, dp->d_name+len+4)) == 0)
continue;
if (major != -1 && found_dot_a) { /* XXX */
free(path);
path = NULL;
found_dot_a = 0;
}
if (major == -1 && minor == -1) {
might_take_it = 1;
} else if (major != -1 && minor == -1) {
@ -192,12 +210,19 @@ int *majorp, *minorp;
if (path)
free(path);
path = concat(search_dirs[i], "/", dp->d_name);
found_dot_a = 0;
bcopy(tmp, dewey, sizeof(dewey));
ndewey = n;
*majorp = dewey[0];
*minorp = dewey[1];
}
closedir(dd);
if (found_dot_a)
/*
* There's a .a archive here.
*/
return path;
}
return path;

View file

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: ldconfig.c,v 1.1 1993/10/23 00:17:03 pk Exp $
* $Id: ldconfig.c,v 1.2 1993/11/09 04:19:22 paul Exp $
*/
#include <sys/param.h>
@ -58,7 +58,6 @@ static int verbose;
static int nostd;
static int justread;
#define MAXDEWEY 8
struct shlib_list {
/* Internal list of shared libraries found */
char *name;
@ -401,9 +400,13 @@ listhints()
return -1;
}
printf("\t-l%s.%d.%d => %s\n",
printf("\t%d:-l%s.%d.%d => %s (%d -> %d)\n",
i,
strtab + bp->hi_namex, bp->hi_major, bp->hi_minor,
strtab + bp->hi_pathx);
strtab + bp->hi_pathx,
hinthash(strtab+bp->hi_namex, bp->hi_major, bp->hi_minor)
% hdr->hh_nbucket,
bp->hi_next);
}
return 0;