Mercurial > hg > index.cgi
annotate lwlink/link.c @ 316:c4853a54b4a1
Documented new "high" option for link scripts.
author | William Astle <lost@l-w.ca> |
---|---|
date | Wed, 27 Nov 2013 16:08:02 -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 } |