4cb4bdc85f
the -U command line option, and one via file scanning. Turns out only the second would increment the number of global names, so adding names with -U would cause names found via scanning to fall off the end of the list! This wouldn't cause linker errors because fixups don't use the list, but would cause the generated symbol table in the output to be incorrect.
95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/*
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*/
|
|
#ifndef lint
|
|
static char rcsid[] = "$Id$";
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <out.h>
|
|
#include "const.h"
|
|
#include "memory.h"
|
|
#include "sym.h"
|
|
|
|
static void generate_section_names();
|
|
|
|
extern struct outhead outhead;
|
|
extern bool incore;
|
|
extern int flagword;
|
|
|
|
/*
|
|
* We have counted all relocation structs but we know only now if
|
|
* these must be emitted.We add all names here,unless the -s(trip)
|
|
* flag was given.
|
|
* If this flag is given we don't need the string table either.
|
|
*/
|
|
beginoutput()
|
|
{
|
|
extern long NLChars, NGChars;
|
|
extern char *outputname;
|
|
|
|
if (! wr_open(outputname)) {
|
|
fatal("can't create %s", outputname);
|
|
}
|
|
if (incore)
|
|
generate_section_names();
|
|
|
|
if (!(flagword & (CFLAG|RFLAG)))
|
|
outhead.oh_nrelo = (unsigned short)0;
|
|
if (flagword & SFLAG) {
|
|
outhead.oh_nname = (unsigned short)0;
|
|
outhead.oh_nchar = (long)0;
|
|
} else {
|
|
outhead.oh_nname = NLocals + NGlobals + outhead.oh_nsect;
|
|
outhead.oh_nchar = NLChars + NGChars;
|
|
}
|
|
if (!incore)
|
|
begin_write();
|
|
}
|
|
|
|
/*
|
|
* Generate names for all sections and put them after the global names.
|
|
* Section names are used for relocation.
|
|
*/
|
|
static void
|
|
generate_section_names()
|
|
{
|
|
register struct outname *name;
|
|
register int sectindex;
|
|
register long size;
|
|
extern struct outsect outsect[];
|
|
extern char *core_alloc();
|
|
|
|
size = (long)outhead.oh_nsect * sizeof(struct outname);
|
|
name = (struct outname *)core_alloc(ALLOGLOB, size);
|
|
if (name == (struct outname *)0)
|
|
return;
|
|
|
|
for (sectindex = 0; sectindex < outhead.oh_nsect; sectindex++, name++) {
|
|
name->on_foff = (long)0; /* No string name. */
|
|
name->on_type = (S_MIN + sectindex) | S_SCT;
|
|
name->on_desc = (unsigned short)0;
|
|
name->on_valu = outsect[sectindex].os_base;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* If we didn't keep the whole output file in core, most of it has been
|
|
* written out, and we just finish that.
|
|
* If we did, we write out our pieces of core.
|
|
*/
|
|
endoutput()
|
|
{
|
|
if (!incore) {
|
|
if (!(flagword & SFLAG))
|
|
end_write();
|
|
} else {
|
|
write_bytes();
|
|
}
|
|
wr_close();
|
|
}
|