Rev 5191 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5191 | serge | 1 | /* NLM (NetWare Loadable Module) support for BFD. |
6324 | serge | 2 | Copyright (C) 1993-2015 Free Software Foundation, Inc. |
5191 | serge | 3 | |
4 | Written by Fred Fish @ Cygnus Support. |
||
5 | |||
6 | This file is part of BFD, the Binary File Descriptor library. |
||
7 | |||
8 | This program is free software; you can redistribute it and/or modify |
||
9 | it under the terms of the GNU General Public License as published by |
||
10 | the Free Software Foundation; either version 3 of the License, or |
||
11 | (at your option) any later version. |
||
12 | |||
13 | This program is distributed in the hope that it will be useful, |
||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
16 | GNU General Public License for more details. |
||
17 | |||
18 | You should have received a copy of the GNU General Public License |
||
19 | along with this program; if not, write to the Free Software |
||
20 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
||
21 | MA 02110-1301, USA. */ |
||
22 | |||
23 | /* This file is part of NLM support for BFD, and contains the portions |
||
24 | that describe how NLM is represented internally in the BFD library. |
||
25 | I.E. it describes the in-memory representation of NLM. It requires |
||
26 | the nlm/common.h file which contains the portions that are common to |
||
27 | both the internal and external representations. */ |
||
28 | |||
29 | #if 0 |
||
30 | |||
31 | /* Types used by various structures, functions, etc. */ |
||
32 | |||
33 | typedef unsigned long Nlm32_Addr; /* Unsigned program address */ |
||
34 | typedef unsigned long Nlm32_Off; /* Unsigned file offset */ |
||
35 | typedef long Nlm32_Sword; /* Signed large integer */ |
||
36 | typedef unsigned long Nlm32_Word; /* Unsigned large integer */ |
||
37 | typedef unsigned short Nlm32_Half; /* Unsigned medium integer */ |
||
38 | typedef unsigned char Nlm32_Char; /* Unsigned tiny integer */ |
||
39 | |||
40 | #ifdef BFD_HOST_64_BIT |
||
41 | typedef unsigned BFD_HOST_64_BIT Nlm64_Addr; |
||
42 | typedef unsigned BFD_HOST_64_BIT Nlm64_Off; |
||
43 | typedef BFD_HOST_64_BIT Nlm64_Sxword; |
||
44 | typedef unsigned BFD_HOST_64_BIT Nlm64_Xword; |
||
45 | #endif |
||
46 | typedef long Nlm64_Sword; |
||
47 | typedef unsigned long Nlm64_Word; |
||
48 | typedef unsigned short Nlm64_Half; |
||
49 | |||
50 | #endif /* 0 */ |
||
51 | |||
52 | /* This structure contains the internal form of the portion of the NLM |
||
53 | header that is fixed length. */ |
||
54 | |||
55 | typedef struct nlm_internal_fixed_header |
||
56 | { |
||
57 | /* The signature field identifies the file as an NLM. It must contain |
||
58 | the signature string, which depends upon the NLM target. */ |
||
59 | |||
60 | char signature[NLM_SIGNATURE_SIZE]; |
||
61 | |||
62 | /* The version of the header. At this time, the highest version number |
||
63 | is 4. */ |
||
64 | |||
65 | long version; |
||
66 | |||
67 | /* The name of the module, which must be a DOS name (1-8 characters followed |
||
68 | by a period and a 1-3 character extension. The first byte is the byte |
||
69 | length of the name and the last byte is a null terminator byte. This |
||
70 | field is fixed length, and any unused bytes should be null bytes. The |
||
71 | value is set by the OUTPUT keyword to NLMLINK. */ |
||
72 | |||
73 | char moduleName[NLM_MODULE_NAME_SIZE]; |
||
74 | |||
75 | /* The byte offset of the code image from the start of the file. */ |
||
76 | |||
77 | file_ptr codeImageOffset; |
||
78 | |||
79 | /* The size of the code image, in bytes. */ |
||
80 | |||
81 | bfd_size_type codeImageSize; |
||
82 | |||
83 | /* The byte offset of the data image from the start of the file. */ |
||
84 | |||
85 | file_ptr dataImageOffset; |
||
86 | |||
87 | /* The size of the data image, in bytes. */ |
||
88 | |||
89 | bfd_size_type dataImageSize; |
||
90 | |||
91 | /* The size of the uninitialized data region that the loader is to be |
||
92 | allocated at load time. Uninitialized data follows the initialized |
||
93 | data in the NLM address space. */ |
||
94 | |||
95 | bfd_size_type uninitializedDataSize; |
||
96 | |||
97 | /* The byte offset of the custom data from the start of the file. The |
||
98 | custom data is set by the CUSTOM keyword to NLMLINK. */ |
||
99 | |||
100 | file_ptr customDataOffset; |
||
101 | |||
102 | /* The size of the custom data, in bytes. */ |
||
103 | |||
104 | bfd_size_type customDataSize; |
||
105 | |||
106 | /* The byte offset of the module dependencies from the start of the file. |
||
107 | The module dependencies are determined by the MODULE keyword in |
||
108 | NLMLINK. */ |
||
109 | |||
110 | file_ptr moduleDependencyOffset; |
||
111 | |||
112 | /* The number of module dependencies at the moduleDependencyOffset. */ |
||
113 | |||
114 | long numberOfModuleDependencies; |
||
115 | |||
116 | /* The byte offset of the relocation fixup data from the start of the file */ |
||
117 | |||
118 | file_ptr relocationFixupOffset; |
||
119 | long numberOfRelocationFixups; |
||
120 | file_ptr externalReferencesOffset; |
||
121 | long numberOfExternalReferences; |
||
122 | file_ptr publicsOffset; |
||
123 | long numberOfPublics; |
||
124 | file_ptr debugInfoOffset; |
||
125 | long numberOfDebugRecords; |
||
126 | file_ptr codeStartOffset; |
||
127 | file_ptr exitProcedureOffset; |
||
128 | file_ptr checkUnloadProcedureOffset; |
||
129 | long moduleType; |
||
130 | long flags; |
||
131 | } Nlm_Internal_Fixed_Header; |
||
132 | |||
133 | #define nlm32_internal_fixed_header nlm_internal_fixed_header |
||
134 | #define Nlm32_Internal_Fixed_Header Nlm_Internal_Fixed_Header |
||
135 | #define nlm64_internal_fixed_header nlm_internal_fixed_header |
||
136 | #define Nlm64_Internal_Fixed_Header Nlm_Internal_Fixed_Header |
||
137 | |||
138 | /* This structure contains the portions of the NLM header that are either |
||
139 | variable in size in the external representation, or else are not at a |
||
140 | fixed offset relative to the start of the NLM header due to preceding |
||
141 | variable sized fields. |
||
142 | |||
143 | Note that all the fields must exist in the external header, and in |
||
144 | the order used here (the same order is used in the internal form |
||
145 | for consistency, not out of necessity). */ |
||
146 | |||
147 | typedef struct nlm_internal_variable_header |
||
148 | { |
||
149 | |||
150 | /* The descriptionLength field contains the length of the text in |
||
151 | descriptionText, excluding the null terminator. The descriptionText |
||
152 | field contains the NLM description obtained from the DESCRIPTION |
||
153 | keyword in NLMLINK plus the null byte terminator. The descriptionText |
||
154 | can be up to NLM_MAX_DESCRIPTION_LENGTH characters. */ |
||
155 | |||
156 | unsigned char descriptionLength; |
||
157 | char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1]; |
||
158 | |||
159 | /* The stackSize field contains the size of the stack in bytes, as |
||
160 | specified by the STACK or STACKSIZE keyword in NLMLINK. If no size |
||
161 | is specified, the default is NLM_DEFAULT_STACKSIZE. */ |
||
162 | |||
163 | long stackSize; |
||
164 | |||
165 | /* The reserved field is included only for completeness. It should contain |
||
166 | zero. */ |
||
167 | |||
168 | long reserved; |
||
169 | |||
170 | /* This field is fixed length, should contain " LONG" (note leading |
||
171 | space), and is unused. */ |
||
172 | |||
173 | char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH]; |
||
174 | |||
175 | /* The screenNameLength field contains the length of the actual text stored |
||
176 | in the screenName field, excluding the null byte terminator. The |
||
177 | screenName field contains the screen name as specified by the SCREENNAME |
||
178 | keyword in NLMLINK, and can be up to NLM_MAX_SCREEN_NAME_LENGTH |
||
179 | characters. */ |
||
180 | |||
181 | unsigned char screenNameLength; |
||
182 | char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1]; |
||
183 | |||
184 | /* The threadNameLength field contains the length of the actual text stored |
||
185 | in the threadName field, excluding the null byte terminator. The |
||
186 | threadName field contains the thread name as specified by the THREADNAME |
||
187 | keyword in NLMLINK, and can be up to NLM_MAX_THREAD_NAME_LENGTH |
||
188 | characters. */ |
||
189 | |||
190 | unsigned char threadNameLength; |
||
191 | char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1]; |
||
192 | |||
193 | } Nlm_Internal_Variable_Header; |
||
194 | |||
195 | #define nlm32_internal_variable_header nlm_internal_variable_header |
||
196 | #define Nlm32_Internal_Variable_Header Nlm_Internal_Variable_Header |
||
197 | #define nlm64_internal_variable_header nlm_internal_variable_header |
||
198 | #define Nlm64_Internal_Variable_Header Nlm_Internal_Variable_Header |
||
199 | |||
200 | /* The version header is one of the optional auxiliary headers and |
||
201 | follows the fixed length and variable length NLM headers. */ |
||
202 | |||
203 | typedef struct nlm_internal_version_header |
||
204 | { |
||
205 | /* The header is recognized by "VeRsIoN#" in the stamp field. */ |
||
206 | char stamp[8]; |
||
207 | long majorVersion; |
||
208 | long minorVersion; |
||
209 | long revision; |
||
210 | long year; |
||
211 | long month; |
||
212 | long day; |
||
213 | } Nlm_Internal_Version_Header; |
||
214 | |||
215 | #define nlm32_internal_version_header nlm_internal_version_header |
||
216 | #define Nlm32_Internal_Version_Header Nlm_Internal_Version_Header |
||
217 | #define nlm64_internal_version_header nlm_internal_version_header |
||
218 | #define Nlm64_Internal_Version_Header Nlm_Internal_Version_Header |
||
219 | |||
220 | typedef struct nlm_internal_copyright_header |
||
221 | { |
||
222 | /* The header is recognized by "CoPyRiGhT=" in the stamp field. */ |
||
223 | char stamp[10]; |
||
224 | unsigned char copyrightMessageLength; |
||
225 | char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH]; |
||
226 | } Nlm_Internal_Copyright_Header; |
||
227 | |||
228 | #define nlm32_internal_copyright_header nlm_internal_copyright_header |
||
229 | #define Nlm32_Internal_Copyright_Header Nlm_Internal_Copyright_Header |
||
230 | #define nlm64_internal_copyright_header nlm_internal_copyright_header |
||
231 | #define Nlm64_Internal_Copyright_Header Nlm_Internal_Copyright_Header |
||
232 | |||
233 | typedef struct nlm_internal_extended_header |
||
234 | { |
||
235 | /* The header is recognized by "MeSsAgEs" in the stamp field. */ |
||
236 | char stamp[8]; |
||
237 | long languageID; |
||
238 | file_ptr messageFileOffset; |
||
239 | bfd_size_type messageFileLength; |
||
240 | long messageCount; |
||
241 | file_ptr helpFileOffset; |
||
242 | bfd_size_type helpFileLength; |
||
243 | file_ptr RPCDataOffset; |
||
244 | bfd_size_type RPCDataLength; |
||
245 | file_ptr sharedCodeOffset; |
||
246 | bfd_size_type sharedCodeLength; |
||
247 | file_ptr sharedDataOffset; |
||
248 | bfd_size_type sharedDataLength; |
||
249 | file_ptr sharedRelocationFixupOffset; |
||
250 | long sharedRelocationFixupCount; |
||
251 | file_ptr sharedExternalReferenceOffset; |
||
252 | long sharedExternalReferenceCount; |
||
253 | file_ptr sharedPublicsOffset; |
||
254 | long sharedPublicsCount; |
||
255 | file_ptr sharedDebugRecordOffset; |
||
256 | long sharedDebugRecordCount; |
||
257 | bfd_vma SharedInitializationOffset; |
||
258 | bfd_vma SharedExitProcedureOffset; |
||
259 | long productID; |
||
260 | long reserved0; |
||
261 | long reserved1; |
||
262 | long reserved2; |
||
263 | long reserved3; |
||
264 | long reserved4; |
||
265 | long reserved5; |
||
266 | } Nlm_Internal_Extended_Header; |
||
267 | |||
268 | #define nlm32_internal_extended_header nlm_internal_extended_header |
||
269 | #define Nlm32_Internal_Extended_Header Nlm_Internal_Extended_Header |
||
270 | #define nlm64_internal_extended_header nlm_internal_extended_header |
||
271 | #define Nlm64_Internal_Extended_Header Nlm_Internal_Extended_Header |
||
272 | |||
273 | /* The format of a custom header as stored internally is different |
||
274 | from the external format. This is how we store a custom header |
||
275 | which we do not recognize. */ |
||
276 | |||
277 | typedef struct nlm_internal_custom_header |
||
278 | { |
||
279 | /* The header is recognized by "CuStHeAd" in the stamp field. */ |
||
280 | char stamp[8]; |
||
281 | bfd_size_type hdrLength; |
||
282 | file_ptr dataOffset; |
||
283 | bfd_size_type dataLength; |
||
284 | char dataStamp[8]; |
||
285 | void *hdr; |
||
286 | } Nlm_Internal_Custom_Header; |
||
287 | |||
288 | #define nlm32_internal_custom_header nlm_internal_custom_header |
||
289 | #define Nlm32_Internal_Custom_Header Nlm_Internal_Custom_Header |
||
290 | #define nlm64_internal_custom_header nlm_internal_custom_header |
||
291 | #define Nlm64_Internal_Custom_Header Nlm_Internal_Custom_Header |
||
292 | |||
293 | /* The internal Cygnus header is written out externally as a custom |
||
294 | header. We don't try to replicate that structure here. */ |
||
295 | |||
296 | typedef struct nlm_internal_cygnus_ext_header |
||
297 | { |
||
298 | /* The header is recognized by "CyGnUsEx" in the stamp field. */ |
||
299 | char stamp[8]; |
||
300 | /* File location of debugging information. */ |
||
301 | file_ptr offset; |
||
302 | /* Length of debugging information. */ |
||
303 | bfd_size_type length; |
||
304 | } Nlm_Internal_Cygnus_Ext_Header; |
||
305 | |||
306 | #define nlm32_internal_cygnus_ext_header nlm_internal_cygnus_ext_header |
||
307 | #define Nlm32_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header |
||
308 | #define nlm64_internal_cygnus_ext_header nlm_internal_cygnus_ext_header |
||
309 | #define Nlm64_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header |