1 /* NLM (NetWare Loadable Module) support for BFD. 2 Copyright (C) 1993-2014 Free Software Foundation, Inc. 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 310