|
|
1.1 root 1: /*
2: * ld/message.c
3: * Print messages of various origins.
4: * And misc functions.
5: */
6:
7: #include "ld.h"
8: #include <errno.h>
9:
10: extern char *memset();
11:
12: /*
13: * Fatal error; print message and exit
14: */
15: void
16: fatal(args)
17: char *args;
18: {
19: if (!Qflag)
20: fprintf(stderr, "%s: %r\n", argv0, &args);
21: exit(1);
22: }
23:
24: void
25: message(args)
26: char * args;
27: {
28: errCount++;
29: if (Qflag)
30: return;
31: fprintf(stderr, "%s: %r\n", argv0, &args);
32: }
33:
34: void
35: watch_message(args)
36: char * args;
37: {
38: fprintf(stderr, "%s: %r\n", argv0, &args);
39: }
40:
41: /*
42: * message plus command prototype
43: */
44: void
45: help()
46: {
47: static char document[] =
48: "Usage ld\n"
49: "\t-d\t\tDefine commons even if undefined symbols\n"
50: "\t-e entry\tSet entry point\n"
51: "\t-K\t\tCompile kernel\n"
52: "\t-l lib\t\tUse library\n"
53: "\t-o outfile\tSet output filename default is a.out\n"
54: "\t-r\t\tRetain relocation information\n"
55: "\t-s\t\tStrip symbol table\n"
56: "\t-u sym\t\tUndefine sym\n"
57: "\t-w\t\tWatch messages enabled\n"
58: "\t-X\t\tDiscard local symbols beginning .L\n"
59: "\t-x\t\tDiscard all local symbols\n";
60:
61: printf(document);
62: exit(0);
63: }
64:
65: usage()
66: {
67: fprintf(stderr,
68: "usage: ld [-drswxX?] [-o out] [-e entry] [-u sym] file ... [-l lib] ...\n");
69: exit(1);
70: }
71:
72: /*
73: * message with filename
74: */
75: void
76: filemsg(fname, args)
77: char *fname, *args;
78: {
79: message( "file '%s': %r", fname, &args );
80: }
81:
82: /*
83: * Message with module and file name
84: */
85: void
86: modmsg(fname, mname, args)
87: char * fname;
88: char * mname;
89: char * args;
90: {
91: if (mname[0] == 0)
92: filemsg(fname, "%r", &args );
93:
94: else
95: filemsg(fname, "module '%.*s': %r",
96: DIRSIZ, mname, &args );
97: }
98:
99: /*
100: * Message for module passed by pointer
101: */
102: void
103: mpmsg(mp, args)
104: mod_t * mp;
105: char * args;
106: {
107: modmsg(mp->fname, mp->mname, "%r", &args);
108: }
109:
110: /*
111: * Module is corrupt message.
112: */
113: void
114: corrupt(mp)
115: {
116: mpmsg(mp, "is corrupt");
117: /* This does not make sense as an object module. */
118: exit (1);
119: }
120:
121: /*
122: * Message for symbol passed by pointer
123: */
124: void
125: spmsg(sp, args)
126: sym_t *sp;
127: char *args;
128: {
129: static char msg[] = "symbol '%s' %r";
130: char work[SYMNMLEN + 1], *name;
131:
132: name = symName(&(sp->sym), work);
133:
134: if (sp->mod == NULL)
135: message(msg, name, &args);
136: else
137: mpmsg(sp->mod, msg, name, &args);
138: }
139:
140: /*
141: * Warning message for symbol passed by pointer
142: */
143: void
144: spwarn(sp, args)
145: sym_t *sp;
146: char *args;
147: {
148: static char msg[] = "warning: symbol '%s' %r";
149: char work[SYMNMLEN + 1], *name;
150:
151: if (qflag)
152: return;
153:
154: errCount--; /* don't increment count */
155: name = symName(&(sp->sym), work);
156:
157: if (sp->mod == NULL)
158: message(msg, name, &args);
159: else
160: mpmsg(sp->mod, msg, name, &args);
161: }
162:
163: /*
164: * Open a file or die in the attempt.
165: */
166: int
167: qopen(fn, type)
168: char *fn;
169: {
170: int fd;
171:
172: if (type)
173: fd = creat(fn, 0666);
174: else
175: fd = open(fn, 0);
176:
177: if (-1 == fd) {
178: filemsg(fn, "Cannot open."); /**/
179: exit(1);
180: }
181: return (fd);
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.