1
/* NLM (NetWare Loadable Module) support for BFD.
2
Copyright 1993, 1994 Free Software Foundation, Inc.
4
Written by Fred Fish @ Cygnus Support.
6
This file is part of BFD, the Binary File Descriptor library.
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 2 of the License, or
11
(at your option) any later version.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
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. */
31
/* Types used by various structures, functions, etc. */
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 */
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;
46
typedef long Nlm64_Sword;
47
typedef unsigned long Nlm64_Word;
48
typedef unsigned short Nlm64_Half;
52
/* This structure contains the internal form of the portion of the NLM
53
header that is fixed length. */
55
typedef struct nlm_internal_fixed_header
57
/* The signature field identifies the file as an NLM. It must contain
58
the signature string, which depends upon the NLM target. */
60
char signature[NLM_SIGNATURE_SIZE];
62
/* The version of the header. At this time, the highest version number
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. */
73
char moduleName[NLM_MODULE_NAME_SIZE];
75
/* The byte offset of the code image from the start of the file. */
77
file_ptr codeImageOffset;
79
/* The size of the code image, in bytes. */
81
bfd_size_type codeImageSize;
83
/* The byte offset of the data image from the start of the file. */
85
file_ptr dataImageOffset;
87
/* The size of the data image, in bytes. */
89
bfd_size_type dataImageSize;
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. */
95
bfd_size_type uninitializedDataSize;
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. */
100
file_ptr customDataOffset;
102
/* The size of the custom data, in bytes. */
104
bfd_size_type customDataSize;
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
110
file_ptr moduleDependencyOffset;
112
/* The number of module dependencies at the moduleDependencyOffset. */
114
long numberOfModuleDependencies;
116
/* The byte offset of the relocation fixup data from the start of the file */
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;
131
} Nlm_Internal_Fixed_Header;
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
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.
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). */
147
typedef struct nlm_internal_variable_header
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. */
156
unsigned char descriptionLength;
157
char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1];
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. */
165
/* The reserved field is included only for completeness. It should contain
170
/* This field is fixed length, should contain " LONG" (note leading
171
space), and is unused. */
173
char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH];
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
181
unsigned char screenNameLength;
182
char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1];
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
190
unsigned char threadNameLength;
191
char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1];
193
} Nlm_Internal_Variable_Header;
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
200
/* The version header is one of the optional auxiliary headers and
201
follows the fixed length and variable length NLM headers. */
203
typedef struct nlm_internal_version_header
205
/* The header is recognized by "VeRsIoN#" in the stamp field. */
213
} Nlm_Internal_Version_Header;
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
220
typedef struct nlm_internal_copyright_header
222
/* The header is recognized by "CoPyRiGhT=" in the stamp field. */
224
unsigned char copyrightMessageLength;
225
char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH];
226
} Nlm_Internal_Copyright_Header;
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
233
typedef struct nlm_internal_extended_header
235
/* The header is recognized by "MeSsAgEs" in the stamp field. */
238
file_ptr messageFileOffset;
239
bfd_size_type messageFileLength;
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;
266
} Nlm_Internal_Extended_Header;
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
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. */
277
typedef struct nlm_internal_custom_header
279
/* The header is recognized by "CuStHeAd" in the stamp field. */
281
bfd_size_type hdrLength;
283
bfd_size_type dataLength;
286
} Nlm_Internal_Custom_Header;
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
293
/* The internal Cygnus header is written out externally as a custom
294
header. We don't try to replicate that structure here. */
296
typedef struct nlm_internal_cygnus_ext_header
298
/* The header is recognized by "CyGnUsEx" in the stamp field. */
300
/* File location of debugging information. */
302
/* Length of debugging information. */
303
bfd_size_type length;
304
} Nlm_Internal_Cygnus_Ext_Header;
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