Mercurial > hg > index.cgi
annotate lwlink/link.c @ 320:a640ff4ed95f
Fix dumbosity in outputting the edition byte in os9 target
With the OS9 target, for some unknown reason, lwlink was anding the version
byte with 0x80 which really doesn't make any sense. That means there are
only two editions possible: 0 and 128. Definite dumbosity.
author | William Astle <lost@l-w.ca> |
---|---|
date | Sat, 08 Feb 2014 19:25:11 -0700 |
parents | fcd103148aa6 |
children | 6821f4855702 |
rev | line source |
---|---|
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
1 /* |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
2 link.c |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
3 Copyright © 2009 William Astle |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
4 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
5 This file is part of LWLINK. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
6 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
7 LWLINK is free software: you can redistribute it and/or modify it under the |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
8 terms of the GNU General Public License as published by the Free Software |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
9 Foundation, either version 3 of the License, or (at your option) any later |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
10 version. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
11 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
12 This program is distributed in the hope that it will be useful, but WITHOUT |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
15 more details. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
16 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
17 You should have received a copy of the GNU General Public License along with |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
18 this program. If not, see <http://www.gnu.org/licenses/>. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
19 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
20 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
21 Resolve section and symbol addresses; handle incomplete references |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
22 */ |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
23 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
24 #include <stdio.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
25 #include <stdlib.h> |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
26 #include <string.h> |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
27 |
8
fdc11ef4115b
Switched lwlink to lw_cmdline from argp and also brought in lw_alloc and lw_string to replace util.c
lost@l-w.ca
parents:
2
diff
changeset
|
28 #include <lw_alloc.h> |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
29 #include <lw_string.h> |
8
fdc11ef4115b
Switched lwlink to lw_cmdline from argp and also brought in lw_alloc and lw_string to replace util.c
lost@l-w.ca
parents:
2
diff
changeset
|
30 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
31 #include "expr.h" |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
32 #include "lwlink.h" |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
33 |
148 | 34 void check_os9(void); |
35 | |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
36 struct section_list *sectlist = NULL; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
37 int nsects = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
38 static int nforced = 0; |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
39 static int resolveonly = 0; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
40 |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
41 int quietsym = 1; |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
42 |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
43 symlist_t *symlist = NULL; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
44 |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
45 sectopt_t *section_opts = NULL; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
46 |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
47 void check_section_name(char *name, int *base, fileinfo_t *fn, int down) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
48 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
49 int sn; |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
50 // fprintf(stderr, "Considering sections in %s (%d) for %s\n", fn -> filename, fn -> forced, name); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
51 if (fn -> forced == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
52 return; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
53 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
54 for (sn = 0; sn < fn -> nsections; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
55 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
56 // fprintf(stderr, " Considering section %s\n", fn -> sections[sn].name); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
57 if (!strcmp(name, (char *)(fn -> sections[sn].name))) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
58 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
59 if (fn -> sections[sn].flags & SECTION_CONST) |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
60 continue; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
61 // we have a match |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
62 // fprintf(stderr, " Found\n"); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
63 sectlist = lw_realloc(sectlist, sizeof(struct section_list) * (nsects + 1)); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
64 sectlist[nsects].ptr = &(fn -> sections[sn]); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
65 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
66 fn -> sections[sn].processed = 1; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
67 if (down) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
68 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
69 *base -= fn -> sections[sn].codesize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
70 fn -> sections[sn].loadaddress = *base; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
71 } |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
72 else |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
73 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
74 fn -> sections[sn].loadaddress = *base; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
75 *base += fn -> sections[sn].codesize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
76 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
77 nsects++; |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
78 // fprintf(stderr, "Adding section %s (%s)\n",fn -> sections[sn].name, fn -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
79 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
80 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
81 for (sn = 0; sn < fn -> nsubs; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
82 { |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
83 check_section_name(name, base, fn -> subs[sn], down); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
84 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
85 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
86 |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
87 void add_matching_sections(char *name, int yesflags, int noflags, int *base, int down); |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
88 void check_section_flags(int yesflags, int noflags, int *base, fileinfo_t *fn, int down) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
89 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
90 int sn; |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
91 sectopt_t *so; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
92 |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
93 // fprintf(stderr, "Considering sections in %s (%d) for %x/%x\n", fn -> filename, fn -> forced, yesflags, noflags); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
94 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
95 if (fn -> forced == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
96 return; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
97 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
98 for (sn = 0; sn < fn -> nsections; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
99 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
100 // ignore "constant" sections - they're added during the file resolve stage |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
101 if (fn -> sections[sn].flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
102 continue; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
103 // ignore if the noflags tell us to |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
104 if (noflags && (fn -> sections[sn].flags & noflags)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
105 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
106 // ignore unless the yesflags tell us not to |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
107 if (yesflags && ((fn -> sections[sn].flags & yesflags) == 0)) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
108 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
109 // ignore it if already processed |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
110 if (fn -> sections[sn].processed) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
111 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
112 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
113 // we have a match - now collect *all* sections of the same name! |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
114 // fprintf(stderr, " Found\n"); |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
115 add_matching_sections((char *)(fn -> sections[sn].name), 0, 0, base, down); |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
116 |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
117 /* handle "after padding" */ |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
118 for (so = section_opts; so; so = so -> next) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
119 if (!strcmp(so -> name, (char *)(fn -> sections[sn].name))) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
120 break; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
121 if (so) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
122 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
123 if (so -> aftersize) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
124 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
125 sectlist[nsects - 1].ptr -> afterbytes = so -> afterbytes; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
126 sectlist[nsects - 1].ptr -> aftersize = so -> aftersize; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
127 if (down) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
128 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
129 sectlist[nsects - 1].ptr -> loadaddress -= so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
130 *base -= so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
131 } |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
132 else |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
133 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
134 *base += so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
135 } |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
136 } |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
137 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
138 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
139 // and then continue looking for sections |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
140 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
141 for (sn = 0; sn < fn -> nsubs; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
142 { |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
143 check_section_flags(yesflags, noflags, base, fn -> subs[sn], down); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
144 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
145 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
146 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
147 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
148 |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
149 void add_matching_sections(char *name, int yesflags, int noflags, int *base, int down) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
150 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
151 int fn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
152 if (name) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
153 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
154 // named section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
155 // look for all instances of a section by the specified name |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
156 // and resolve base addresses and add to the list |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
157 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
158 { |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
159 check_section_name(name, base, inputfiles[fn], down); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
160 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
161 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
162 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
163 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
164 // wildcard section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
165 // named section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
166 // look for all instances of a section by the specified name |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
167 // and resolve base addresses and add to the list |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
168 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
169 { |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
170 check_section_flags(yesflags, noflags, base, inputfiles[fn], down); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
171 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
172 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
173 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
174 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
175 // work out section load order and resolve base addresses for each section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
176 // make a list of sections to load in order |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
177 void resolve_sections(void) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
178 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
179 int laddr = 0; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
180 int growdown = 0; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
181 int ln, sn, fn; |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
182 sectopt_t *so; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
183 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
184 for (ln = 0; ln < linkscript.nlines; ln++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
185 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
186 if (linkscript.lines[ln].loadat >= 0) |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
187 { |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
188 laddr = linkscript.lines[ln].loadat; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
189 growdown = linkscript.lines[ln].growsdown; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
190 } |
238
91f91557dc9e
Removed extraneous debug message.
William Astle <lost@l-w.ca>
parents:
236
diff
changeset
|
191 //fprintf(stderr, "Adding section %s\n", linkscript.lines[ln].sectname); |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
192 add_matching_sections(linkscript.lines[ln].sectname, linkscript.lines[ln].yesflags, linkscript.lines[ln].noflags, &laddr, growdown); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
193 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
194 if (linkscript.lines[ln].sectname) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
195 { |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
196 char *sname = linkscript.lines[ln].sectname; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
197 /* handle "after padding" */ |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
198 for (so = section_opts; so; so = so -> next) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
199 if (!strcmp(so -> name, sname)) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
200 break; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
201 if (so) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
202 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
203 if (so -> aftersize) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
204 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
205 sectlist[nsects - 1].ptr -> afterbytes = so -> afterbytes; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
206 sectlist[nsects - 1].ptr -> aftersize = so -> aftersize; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
207 if (growdown) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
208 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
209 sectlist[nsects-1].ptr -> loadaddress -= so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
210 laddr -= so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
211 } |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
212 else |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
213 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
214 laddr += so -> aftersize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
215 } |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
216 } |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
217 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
218 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
219 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
220 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
221 // wildcard section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
222 // look for all sections not yet processed that match flags |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
223 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
224 int f = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
225 int fn0, sn0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
226 char *sname; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
227 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
228 // named section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
229 // look for all instances of a section by the specified name |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
230 // and resolve base addresses and add to the list |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
231 for (fn0 = 0; fn0 < ninputfiles; fn0++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
232 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
233 for (sn0 = 0; sn0 < inputfiles[fn0] -> nsections; sn0++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
234 { |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
235 // ignore "constant" sections |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
236 if (inputfiles[fn0] -> sections[sn0].flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
237 continue; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
238 // ignore if the "no flags" bit says to |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
239 if (linkscript.lines[ln].noflags && (inputfiles[fn0] -> sections[sn0].flags & linkscript.lines[ln].noflags)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
240 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
241 // ignore unless the yes flags tell us not to |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
242 if (linkscript.lines[ln].yesflags && ((inputfiles[fn0] -> sections[sn0].flags & linkscript.lines[ln].yesflags) == 0)) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
243 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
244 if (inputfiles[fn0] -> sections[sn0].processed == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
245 { |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
246 sname = (char *)(inputfiles[fn0] -> sections[sn0].name); |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
247 fprintf(stderr, "Adding sectoin %s\n", sname); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
248 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
249 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
250 for (sn = 0; sn < inputfiles[fn] -> nsections; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
251 { |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
252 if (!strcmp(sname, (char *)(inputfiles[fn] -> sections[sn].name))) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
253 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
254 // we have a match |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
255 sectlist = lw_realloc(sectlist, sizeof(struct section_list) * (nsects + 1)); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
256 sectlist[nsects].ptr = &(inputfiles[fn] -> sections[sn]); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
257 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
258 inputfiles[fn] -> sections[sn].processed = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
259 if (!f && linkscript.lines[ln].loadat >= 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
260 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
261 f = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
262 sectlist[nsects].forceaddr = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
263 laddr = linkscript.lines[ln].loadat; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
264 growdown = linkscript.lines[ln].growsdown; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
265 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
266 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
267 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
268 sectlist[nsects].forceaddr = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
269 } |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
270 if (growdown) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
271 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
272 laddr -= inputfiles[fn] -> sections[sn].codesize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
273 inputfiles[fn] -> sections[sn].loadaddress = laddr; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
274 } |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
275 else |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
276 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
277 inputfiles[fn] -> sections[sn].loadaddress = laddr; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
278 laddr += inputfiles[fn] -> sections[sn].codesize; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
279 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
280 nsects++; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
281 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
282 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
283 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
284 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
285 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
286 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
287 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
288 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
289 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
290 // theoretically, all the base addresses are set now |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
291 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
292 |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
293 /* run through all sections and generate any synthetic symbols */ |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
294 void generate_symbols(void) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
295 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
296 int sn; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
297 char *lastsect = NULL; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
298 char sym[256]; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
299 int len; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
300 symlist_t *se; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
301 int lowaddr; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
302 |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
303 for (sn = 0; sn < nsects; sn++) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
304 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
305 if (!lastsect || strcmp(lastsect, (char *)(sectlist[sn].ptr -> name))) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
306 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
307 if (lastsect && linkscript.lensympat) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
308 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
309 /* handle length symbol */ |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
310 se = lw_alloc(sizeof(symlist_t)); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
311 se -> val = len; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
312 snprintf(sym, 255, linkscript.lensympat, lastsect); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
313 se -> sym = lw_strdup(sym); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
314 se -> next = symlist; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
315 symlist = se; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
316 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
317 if (lastsect && linkscript.basesympat) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
318 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
319 se = lw_alloc(sizeof(symlist_t)); |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
320 se -> val = lowaddr; |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
321 snprintf(sym, 255, linkscript.basesympat, lastsect); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
322 se -> sym = lw_strdup(sym); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
323 se -> next = symlist; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
324 symlist = se; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
325 } |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
326 lastsect = (char *)(sectlist[sn].ptr -> name); |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
327 len = 0; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
328 lowaddr = sectlist[sn].ptr -> loadaddress; |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
329 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
330 len += sectlist[sn].ptr -> codesize; |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
331 if (sectlist[sn].ptr -> loadaddress < lowaddr) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
332 lowaddr = sectlist[sn].ptr -> loadaddress; |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
333 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
334 if (lastsect && linkscript.lensympat) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
335 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
336 /* handle length symbol */ |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
337 se = lw_alloc(sizeof(symlist_t)); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
338 se -> val = len; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
339 snprintf(sym, 255, linkscript.lensympat, lastsect); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
340 se -> sym = lw_strdup(sym); |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
341 se -> next = symlist; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
342 symlist = se; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
343 } |
315
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
344 if (lastsect && linkscript.basesympat) |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
345 { |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
346 se = lw_alloc(sizeof(symlist_t)); |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
347 se -> val = lowaddr; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
348 snprintf(sym, 255, linkscript.basesympat, lastsect); |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
349 se -> sym = lw_strdup(sym); |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
350 se -> next = symlist; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
351 symlist = se; |
fcd103148aa6
Add ability to load sections downward instead of upward
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
352 } |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
353 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
354 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
355 lw_expr_stack_t *find_external_sym_recurse(char *sym, fileinfo_t *fn) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
356 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
357 int sn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
358 lw_expr_stack_t *r; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
359 lw_expr_term_t *term; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
360 symtab_t *se; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
361 int val; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
362 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
363 for (sn = 0; sn < fn -> nsections; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
364 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
365 for (se = fn -> sections[sn].exportedsyms; se; se = se -> next) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
366 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
367 // fprintf(stderr, " Considering %s\n", se -> sym); |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
368 if (!strcmp(sym, (char *)(se -> sym))) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
369 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
370 // fprintf(stderr, " Match (%d)\n", fn -> sections[sn].processed); |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
371 // if the section was not previously processed and is CONSTANT, force it in |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
372 // otherwise error out if it is not being processed |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
373 if (fn -> sections[sn].processed == 0) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
374 { |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
375 if (fn -> sections[sn].flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
376 { |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
377 // add to section list |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
378 sectlist = lw_realloc(sectlist, sizeof(struct section_list) * (nsects + 1)); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
379 sectlist[nsects].ptr = &(fn -> sections[sn]); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
380 fn -> sections[sn].processed = 1; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
381 fn -> sections[sn].loadaddress = 0; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
382 nsects++; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
383 } |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
384 else |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
385 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
386 if (resolveonly == 0) |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
387 { |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
388 fprintf(stderr, "Symbol %s found in section %s (%s) which is not going to be included\n", sym, fn -> sections[sn].name, fn -> filename); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
389 continue; |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
390 } |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
391 } |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
392 } |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
393 // fprintf(stderr, "Found symbol %s in %s\n", sym, fn -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
394 if (!(fn -> forced)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
395 { |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
396 // fprintf(stderr, " Forced\n"); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
397 fn -> forced = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
398 nforced = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
399 } |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
400 if (fn -> sections[sn].flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
401 val = se -> offset; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
402 else |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
403 val = se -> offset + fn -> sections[sn].loadaddress; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
404 r = lw_expr_stack_create(); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
405 term = lw_expr_term_create_int(val & 0xffff); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
406 lw_expr_stack_push(r, term); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
407 lw_expr_term_free(term); |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
408 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
409 return r; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
410 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
411 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
412 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
413 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
414 for (sn = 0; sn < fn -> nsubs; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
415 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
416 // fprintf(stderr, "Looking in %s\n", fn -> subs[sn] -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
417 r = find_external_sym_recurse(sym, fn -> subs[sn]); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
418 if (r) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
419 { |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
420 // fprintf(stderr, "Found symbol %s in %s\n", sym, fn -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
421 if (!(fn -> forced)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
422 { |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
423 // fprintf(stderr, " Forced\n"); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
424 nforced = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
425 fn -> forced = 1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
426 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
427 return r; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
428 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
429 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
430 return NULL; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
431 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
432 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
433 // resolve all incomplete references now |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
434 // anything that is unresolvable at this stage will throw an error |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
435 // because we know the load address of every section now |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
436 lw_expr_stack_t *resolve_sym(char *sym, int symtype, void *state) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
437 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
438 section_t *sect = state; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
439 lw_expr_term_t *term; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
440 int val = 0, i, fn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
441 lw_expr_stack_t *s; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
442 symtab_t *se; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
443 fileinfo_t *fp; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
444 |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
445 // fprintf(stderr, "Looking up %s\n", sym); |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
446 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
447 if (symtype == 1) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
448 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
449 // local symbol |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
450 if (!sym) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
451 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
452 val = sect -> loadaddress; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
453 goto out; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
454 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
455 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
456 // start with this section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
457 for (se = sect -> localsyms; se; se = se -> next) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
458 { |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
459 if (!strcmp((char *)(se -> sym), sym)) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
460 { |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
461 if (sect -> flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
462 val = se -> offset; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
463 else |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
464 val = se -> offset + sect -> loadaddress; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
465 goto out; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
466 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
467 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
468 // not in this section - check all sections in this file |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
469 for (i = 0; i < sect -> file -> nsections; i++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
470 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
471 for (se = sect -> file -> sections[i].localsyms; se; se = se -> next) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
472 { |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
473 if (!strcmp((char *)(se -> sym), sym)) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
474 { |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
475 if (sect -> file -> sections[i].flags & SECTION_CONST) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
476 val = se -> offset; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
477 else |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
155
diff
changeset
|
478 val = se -> offset + sect -> file -> sections[i].loadaddress; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
479 goto out; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
480 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
481 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
482 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
483 // not found |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
484 if (!quietsym) |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
485 { |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
486 symerr = 1; |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
487 fprintf(stderr, "Local symbol %s not found in %s:%s\n", sanitize_symbol(sym), sect -> file -> filename, sect -> name); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
488 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
489 goto outerr; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
490 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
491 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
492 { |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
493 symlist_t *se; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
494 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
495 // external symbol |
234
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
496 // first look up synthesized symbols |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
497 for (se = symlist; se; se = se -> next) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
498 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
499 if (!strcmp(se -> sym, sym)) |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
500 { |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
501 val = se -> val; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
502 goto out; |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
503 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
504 } |
d389adbcc4ab
Added section base and length symbols to lwlink
William Astle <lost@l-w.ca>
parents:
157
diff
changeset
|
505 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
506 // read all files in order until found (or not found) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
507 if (sect) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
508 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
509 for (fp = sect -> file; fp; fp = fp -> parent) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
510 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
511 // fprintf(stderr, "Looking in %s\n", fp -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
512 s = find_external_sym_recurse(sym, fp); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
513 if (s) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
514 return s; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
515 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
516 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
517 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
518 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
519 { |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
520 // fprintf(stderr, "Looking in %s\n", inputfiles[fn] -> filename); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
521 s = find_external_sym_recurse(sym, inputfiles[fn]); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
522 if (s) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
523 return s; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
524 } |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
525 if (!quietsym) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
526 { |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
527 if (sect) |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
528 { |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
529 fprintf(stderr, "External symbol %s not found in %s:%s\n", sanitize_symbol(sym), sect -> file -> filename, sect -> name); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
530 } |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
531 else |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
532 { |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
533 fprintf(stderr, "External symbol %s not found\n", sym); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
534 } |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
535 symerr = 1; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
536 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
537 goto outerr; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
538 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
539 fprintf(stderr, "Shouldn't ever get here!!!\n"); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
540 exit(88); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
541 out: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
542 s = lw_expr_stack_create(); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
543 term = lw_expr_term_create_int(val & 0xffff); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
544 lw_expr_stack_push(s, term); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
545 lw_expr_term_free(term); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
546 return s; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
547 outerr: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
548 return NULL; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
549 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
550 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
551 void resolve_references(void) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
552 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
553 int sn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
554 reloc_t *rl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
555 int rval; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
556 |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
557 quietsym = 0; |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
558 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
559 // resolve entry point if required |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
560 // this must resolve to an *exported* symbol and will resolve to the |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
561 // first instance of that symbol |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
562 if (linkscript.execsym) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
563 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
564 lw_expr_stack_t *s; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
565 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
566 s = resolve_sym(linkscript.execsym, 0, NULL); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
567 if (!s) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
568 { |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
569 fprintf(stderr, "Cannot resolve exec address '%s'\n", linkscript.execsym); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
570 symerr = 1; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
571 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
572 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
573 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
574 linkscript.execaddr = lw_expr_get_value(s); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
575 lw_expr_stack_free(s); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
576 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
577 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
578 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
579 for (sn = 0; sn < nsects; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
580 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
581 for (rl = sectlist[sn].ptr -> incompletes; rl; rl = rl -> next) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
582 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
583 // do a "simplify" on the expression |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
584 rval = lw_expr_reval(rl -> expr, resolve_sym, sectlist[sn].ptr); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
585 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
586 // is it constant? error out if not |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
587 if (rval != 0 || !lw_expr_is_constant(rl -> expr)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
588 { |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
589 fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", sectlist[sn].ptr -> file -> filename, sectlist[sn].ptr -> name, rl -> offset); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
590 symerr = 1; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
591 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
592 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
593 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
594 // put the value into the relocation address |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
595 rval = lw_expr_get_value(rl -> expr); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
596 if (rl -> flags & RELOC_8BIT) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
597 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
598 sectlist[sn].ptr -> code[rl -> offset] = rval & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
599 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
600 else |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
601 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
602 sectlist[sn].ptr -> code[rl -> offset] = (rval >> 8) & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
603 sectlist[sn].ptr -> code[rl -> offset + 1] = rval & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
604 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
605 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
606 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
607 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
608 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
609 if (symerr) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
610 exit(1); |
148 | 611 |
612 if (outformat == OUTPUT_OS9) | |
613 check_os9(); | |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
614 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
615 |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
616 void resolve_files_aux(fileinfo_t *fn) |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
617 { |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
618 int sn; |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
619 reloc_t *rl; |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
620 lw_expr_stack_t *te; |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
621 |
264
346966cffeef
Clean up various warnings when building under -Wall
William Astle <lost@l-w.ca>
parents:
263
diff
changeset
|
622 // int rval; |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
623 |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
624 |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
625 if (fn -> forced == 0) |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
626 return; |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
627 |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
628 for (sn = 0; sn < fn -> nsections; sn++) |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
629 { |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
630 for (rl = fn -> sections[sn].incompletes; rl; rl = rl -> next) |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
631 { |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
632 // do a "simplify" on the expression |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
633 te = lw_expr_stack_dup(rl -> expr); |
264
346966cffeef
Clean up various warnings when building under -Wall
William Astle <lost@l-w.ca>
parents:
263
diff
changeset
|
634 lw_expr_reval(te, resolve_sym, &(fn -> sections[sn])); |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
635 |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
636 // is it constant? error out if not |
235
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
637 // incompletes will error out during resolve_references() |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
638 //if (rval != 0 || !lw_expr_is_constant(te)) |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
639 //{ |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
640 // fprintf(stderr, "Incomplete reference at %s:%s+%02X\n", fn -> filename, fn -> sections[sn].name, rl -> offset); |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
641 // symerr = 1; |
e3741cf53e00
Fix error messages related to undefined symbols in lwlink
William Astle <lost@l-w.ca>
parents:
234
diff
changeset
|
642 //} |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
643 lw_expr_stack_free(te); |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
644 } |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
645 } |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
646 |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
647 // handle any sub files |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
648 for (sn = 0; sn < fn -> nsubs; sn++) |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
649 resolve_files_aux(fn -> subs[sn]); |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
650 } |
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
651 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
652 /* |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
653 This is just a pared down version of the algo for resolving references. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
654 */ |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
655 void resolve_files(void) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
656 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
657 int fn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
658 |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
659 resolveonly = 1; |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
660 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
661 // resolve entry point if required |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
662 // this must resolve to an *exported* symbol and will resolve to the |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
663 // first instance of that symbol |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
664 // if (linkscript.execsym) |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
665 // { |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
666 // lw_expr_stack_t *s; |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
667 // |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
668 // s = resolve_sym(linkscript.execsym, 0, NULL); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
669 // if (!s) |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
670 // { |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
671 // fprintf(stderr, "Cannot resolve exec address '%s'\n", sanitize_symbol(linkscript.execsym)); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
672 // symerr = 1; |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
673 // } |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
674 // } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
675 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
676 do |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
677 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
678 nforced = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
679 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
680 { |
155
1571e150f1fd
Fixed error where external references within a library file were not resolved when linking
lost@l-w.ca
parents:
149
diff
changeset
|
681 resolve_files_aux(inputfiles[fn]); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
682 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
683 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
684 while (nforced == 1); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
685 |
157
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
686 resolveonly = 0; |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
687 |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
688 // if (symerr) |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
689 // exit(1); |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
690 |
4682460aed00
Correct bug with handling symbol resolution and constant section handling
lost@l-w.ca
parents:
156
diff
changeset
|
691 symerr = 0; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
692 // theoretically, all files referenced by other files now have "forced" set to 1 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
693 for (fn = 0; fn < ninputfiles; fn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
694 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
695 if (inputfiles[fn] -> forced == 1) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
696 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
697 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
698 fprintf(stderr, "Warning: %s (%d) does not resolve any symbols\n", inputfiles[fn] -> filename, fn); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
699 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
700 } |
148 | 701 void find_section_by_name_once_aux(char *name, fileinfo_t *fn, section_t **rval, int *found); |
702 void find_section_by_name_once_aux(char *name, fileinfo_t *fn, section_t **rval, int *found) | |
703 { | |
704 int sn; | |
705 | |
706 if (fn -> forced == 0) | |
707 return; | |
708 | |
709 for (sn = 0; sn < fn -> nsections; sn++) | |
710 { | |
711 if (!strcmp(name, (char *)(fn -> sections[sn].name))) | |
712 { | |
713 (*found)++; | |
714 *rval = &(fn -> sections[sn]); | |
715 } | |
716 } | |
717 for (sn = 0; sn < fn -> nsubs; sn++) | |
718 { | |
719 find_section_by_name_once_aux(name, fn -> subs[sn], rval, found); | |
720 } | |
721 } | |
722 | |
723 section_t *find_section_by_name_once(char *name) | |
724 { | |
725 int fn; | |
726 int found = 0; | |
727 section_t *rval = NULL; | |
728 | |
729 for (fn = 0; fn < ninputfiles; fn++) | |
730 { | |
731 find_section_by_name_once_aux(name, inputfiles[fn], &rval, &found); | |
732 } | |
733 if (found != 1) | |
734 { | |
735 rval = NULL; | |
149
729a9c70934e
Fixed crash and bogus warning with os9 module target
lost@l-w.ca
parents:
148
diff
changeset
|
736 if (found > 1) |
729a9c70934e
Fixed crash and bogus warning with os9 module target
lost@l-w.ca
parents:
148
diff
changeset
|
737 fprintf(stderr, "Warning: multiple instances of section %s found; ignoring all of them which is probably not what you want\n", name); |
148 | 738 } |
739 return rval; | |
740 } | |
741 | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
742 void foreach_section_aux(char *name, fileinfo_t *fn, void (*fnp)(section_t *s, void *arg), void *arg) |
148 | 743 { |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
744 int sn; |
148 | 745 |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
746 if (fn -> forced == 0) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
747 return; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
748 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
749 for (sn = 0; sn < fn -> nsections; sn++) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
750 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
751 if (!strcmp(name, (char *)(fn -> sections[sn].name))) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
752 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
753 (*fnp)(&(fn -> sections[sn]), arg); |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
754 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
755 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
756 for (sn = 0; sn < fn -> nsubs; sn++) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
757 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
758 foreach_section_aux(name, fn -> subs[sn], fnp, arg); |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
759 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
760 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
761 void foreach_section(char *name, void (*fnp)(section_t *s, void *arg), void *arg) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
762 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
763 int fn; |
148 | 764 |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
765 for (fn = 0; fn < ninputfiles; fn++) |
148 | 766 { |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
767 foreach_section_aux(name, inputfiles[fn], fnp, arg); |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
768 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
769 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
770 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
771 struct check_os9_aux_s |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
772 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
773 int typeseen; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
774 int attrseen; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
775 int langseen; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
776 int revseen; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
777 int nameseen; |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
778 int edseen; |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
779 }; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
780 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
781 void check_os9_aux(section_t *s, void *arg) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
782 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
783 struct check_os9_aux_s *st = arg; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
784 symtab_t *sym; |
148 | 785 |
786 // this section is special | |
787 // several symbols may be defined as LOCAL symbols: | |
788 // type: module type | |
789 // lang: module language | |
790 // attr: module attributes | |
791 // rev: module revision | |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
792 // ed: module edition |
148 | 793 // |
794 // the symbols are not case sensitive | |
795 // | |
796 // any unrecognized symbols are ignored | |
797 | |
798 // the contents of the actual data to the first NUL | |
799 // is assumed to be the module name unless it is an empty string | |
800 if (s -> codesize > 0 && (s -> flags & SECTION_BSS) == 0 && s -> code[0] != 0) | |
801 { | |
802 linkscript.name = (char *)(s -> code); | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
803 st -> nameseen++; |
148 | 804 } |
805 | |
149
729a9c70934e
Fixed crash and bogus warning with os9 module target
lost@l-w.ca
parents:
148
diff
changeset
|
806 for (sym = s -> localsyms; sym; sym = sym -> next) |
148 | 807 { |
808 char *sm = (char *)(sym -> sym); | |
809 if (!strcasecmp(sm, "type")) | |
810 { | |
811 linkscript.modtype = sym -> offset; | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
812 st -> typeseen++; |
148 | 813 } |
814 else if (!strcasecmp(sm, "lang")) | |
815 { | |
816 linkscript.modlang = sym -> offset; | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
817 st -> langseen++; |
148 | 818 } |
819 else if (!strcasecmp(sm, "attr")) | |
820 { | |
257
d5374e80dd04
Fix handling of attr override for os9 output
William Astle <lost@l-w.ca>
parents:
238
diff
changeset
|
821 linkscript.modattr = sym -> offset; |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
822 st -> attrseen++; |
148 | 823 } |
824 else if (!strcasecmp(sm, "rev")) | |
825 { | |
826 linkscript.modrev = sym -> offset; | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
827 st -> revseen++; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
828 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
829 else if (!strcasecmp(sm, "stack")) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
830 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
831 linkscript.stacksize += sym -> offset; |
148 | 832 } |
263
8dd8c3bdca7c
Fix stupid error with ' vs " handling os9 edition
William Astle <lost@l-w.ca>
parents:
262
diff
changeset
|
833 else if (!strcasecmp(sm, "edition")) |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
834 { |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
835 linkscript.edition = sym -> offset; |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
836 st -> edseen++; |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
837 } |
148 | 838 } |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
839 } |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
840 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
841 void check_os9(void) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
842 { |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
843 struct check_os9_aux_s st = { 0 }; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
844 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
845 linkscript.name = outfile; |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
846 foreach_section("__os9", check_os9_aux, &st); |
148 | 847 if (linkscript.modtype > 15) |
848 linkscript.modtype = linkscript.modtype >> 4; | |
849 | |
850 if (linkscript.modattr > 15) | |
851 linkscript.modattr = linkscript.modattr >> 4; | |
852 | |
853 linkscript.modlang &= 15; | |
854 linkscript.modtype &= 15; | |
855 linkscript.modrev &= 15; | |
856 linkscript.modattr &= 15; | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
857 |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
858 if (st.attrseen > 1 || st.typeseen > 1 || |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
859 st.langseen > 1 || st.revseen > 1 || |
264
346966cffeef
Clean up various warnings when building under -Wall
William Astle <lost@l-w.ca>
parents:
263
diff
changeset
|
860 st.nameseen > 1 || st.edseen > 1 |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
861 ) |
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
862 { |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
863 fprintf(stderr, "Warning: multiple instances of __os9 found with duplicate settings of type, lang, attr, rev, edition, or module name.\n"); |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
257
diff
changeset
|
864 } |
148 | 865 } |
236
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
866 |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
867 void resolve_padding(void) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
868 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
869 int sn; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
870 |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
871 for (sn = 0; sn < nsects; sn++) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
872 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
873 if (sectlist[sn].ptr -> afterbytes) |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
874 { |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
875 unsigned char *t; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
876 |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
877 t = lw_alloc(sectlist[sn].ptr -> codesize + sectlist[sn].ptr -> aftersize); |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
878 memmove(t, sectlist[sn].ptr -> code, sectlist[sn].ptr -> codesize); |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
879 sectlist[sn].ptr -> code = t; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
880 memmove(sectlist[sn].ptr -> code + sectlist[sn].ptr -> codesize, sectlist[sn].ptr -> afterbytes, sectlist[sn].ptr -> aftersize); |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
881 sectlist[sn].ptr -> codesize += sectlist[sn].ptr -> aftersize; |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
882 } |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
883 } |
ce1fdc8d6568
Added ability to add padding after a section when linking.
William Astle <lost@l-w.ca>
parents:
235
diff
changeset
|
884 } |