310 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			310 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* NLM (NetWare Loadable Module) support for BFD.
 | 
						|
   Copyright 1993, 1994, 2003, 2005 Free Software Foundation, Inc.
 | 
						|
 | 
						|
   Written by Fred Fish @ Cygnus Support.
 | 
						|
 | 
						|
This file is part of BFD, the Binary File Descriptor library.
 | 
						|
 | 
						|
This program is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2 of the License, or
 | 
						|
(at your option) any later version.
 | 
						|
 | 
						|
This program is distributed in the hope that it will be useful,
 | 
						|
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
GNU General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with this program; if not, write to the Free Software
 | 
						|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 | 
						|
 | 
						|
 | 
						|
/* This file is part of NLM support for BFD, and contains the portions
 | 
						|
   that describe how NLM is represented internally in the BFD library.
 | 
						|
   I.E. it describes the in-memory representation of NLM.  It requires
 | 
						|
   the nlm/common.h file which contains the portions that are common to
 | 
						|
   both the internal and external representations. */
 | 
						|
   
 | 
						|
#if 0
 | 
						|
 | 
						|
/* Types used by various structures, functions, etc. */
 | 
						|
 | 
						|
typedef unsigned long	Nlm32_Addr;	/* Unsigned program address */
 | 
						|
typedef unsigned long	Nlm32_Off;	/* Unsigned file offset */
 | 
						|
typedef 	 long	Nlm32_Sword;	/* Signed large integer */
 | 
						|
typedef unsigned long	Nlm32_Word;	/* Unsigned large integer */
 | 
						|
typedef unsigned short	Nlm32_Half;	/* Unsigned medium integer */
 | 
						|
typedef unsigned char	Nlm32_Char;	/* Unsigned tiny integer */
 | 
						|
 | 
						|
#ifdef BFD_HOST_64_BIT
 | 
						|
typedef unsigned BFD_HOST_64_BIT	Nlm64_Addr;
 | 
						|
typedef unsigned BFD_HOST_64_BIT	Nlm64_Off;
 | 
						|
typedef          BFD_HOST_64_BIT	Nlm64_Sxword;
 | 
						|
typedef unsigned BFD_HOST_64_BIT	Nlm64_Xword;
 | 
						|
#endif
 | 
						|
typedef          long		Nlm64_Sword;
 | 
						|
typedef unsigned long		Nlm64_Word;
 | 
						|
typedef unsigned short		Nlm64_Half;
 | 
						|
 | 
						|
#endif /* 0 */
 | 
						|
 | 
						|
/* This structure contains the internal form of the portion of the NLM
 | 
						|
   header that is fixed length. */
 | 
						|
 | 
						|
typedef struct nlm_internal_fixed_header
 | 
						|
{
 | 
						|
  /* The signature field identifies the file as an NLM.  It must contain
 | 
						|
     the signature string, which depends upon the NLM target. */
 | 
						|
 | 
						|
  char signature[NLM_SIGNATURE_SIZE];
 | 
						|
 | 
						|
  /* The version of the header.  At this time, the highest version number
 | 
						|
     is 4. */
 | 
						|
 | 
						|
  long version;
 | 
						|
 | 
						|
  /* The name of the module, which must be a DOS name (1-8 characters followed
 | 
						|
     by a period and a 1-3 character extension.  The first byte is the byte
 | 
						|
     length of the name and the last byte is a null terminator byte.  This
 | 
						|
     field is fixed length, and any unused bytes should be null bytes.  The
 | 
						|
     value is set by the OUTPUT keyword to NLMLINK. */
 | 
						|
 | 
						|
  char moduleName[NLM_MODULE_NAME_SIZE];
 | 
						|
 | 
						|
  /* The byte offset of the code image from the start of the file. */
 | 
						|
 | 
						|
  file_ptr codeImageOffset;
 | 
						|
 | 
						|
  /* The size of the code image, in bytes. */
 | 
						|
 | 
						|
  bfd_size_type codeImageSize;
 | 
						|
 | 
						|
  /* The byte offset of the data image from the start of the file. */
 | 
						|
 | 
						|
  file_ptr dataImageOffset;
 | 
						|
 | 
						|
  /* The size of the data image, in bytes. */
 | 
						|
 | 
						|
  bfd_size_type dataImageSize;
 | 
						|
 | 
						|
  /* The size of the uninitialized data region that the loader is to be
 | 
						|
     allocated at load time.  Uninitialized data follows the initialized
 | 
						|
     data in the NLM address space. */
 | 
						|
 | 
						|
  bfd_size_type uninitializedDataSize;
 | 
						|
 | 
						|
  /* The byte offset of the custom data from the start of the file.  The
 | 
						|
     custom data is set by the CUSTOM keyword to NLMLINK. */
 | 
						|
 | 
						|
  file_ptr customDataOffset;
 | 
						|
 | 
						|
  /* The size of the custom data, in bytes. */
 | 
						|
 | 
						|
  bfd_size_type customDataSize;
 | 
						|
 | 
						|
  /* The byte offset of the module dependencies from the start of the file.
 | 
						|
     The module dependencies are determined by the MODULE keyword in
 | 
						|
     NLMLINK. */
 | 
						|
 | 
						|
  file_ptr moduleDependencyOffset;
 | 
						|
 | 
						|
  /* The number of module dependencies at the moduleDependencyOffset. */
 | 
						|
 | 
						|
  long numberOfModuleDependencies;
 | 
						|
 | 
						|
  /* The byte offset of the relocation fixup data from the start of the file */
 | 
						|
 | 
						|
  file_ptr relocationFixupOffset;
 | 
						|
  long numberOfRelocationFixups;
 | 
						|
  file_ptr externalReferencesOffset;
 | 
						|
  long numberOfExternalReferences;
 | 
						|
  file_ptr publicsOffset;
 | 
						|
  long numberOfPublics;
 | 
						|
  file_ptr debugInfoOffset;
 | 
						|
  long numberOfDebugRecords;
 | 
						|
  file_ptr codeStartOffset;
 | 
						|
  file_ptr exitProcedureOffset;
 | 
						|
  file_ptr checkUnloadProcedureOffset;
 | 
						|
  long moduleType;
 | 
						|
  long flags;
 | 
						|
} Nlm_Internal_Fixed_Header;
 | 
						|
 | 
						|
#define nlm32_internal_fixed_header nlm_internal_fixed_header
 | 
						|
#define Nlm32_Internal_Fixed_Header Nlm_Internal_Fixed_Header
 | 
						|
#define nlm64_internal_fixed_header nlm_internal_fixed_header
 | 
						|
#define Nlm64_Internal_Fixed_Header Nlm_Internal_Fixed_Header
 | 
						|
 | 
						|
/* This structure contains the portions of the NLM header that are either
 | 
						|
   variable in size in the external representation, or else are not at a
 | 
						|
   fixed offset relative to the start of the NLM header due to preceding
 | 
						|
   variable sized fields.
 | 
						|
 | 
						|
   Note that all the fields must exist in the external header, and in
 | 
						|
   the order used here (the same order is used in the internal form
 | 
						|
   for consistency, not out of necessity). */
 | 
						|
 | 
						|
typedef struct nlm_internal_variable_header
 | 
						|
{
 | 
						|
 | 
						|
  /* The descriptionLength field contains the length of the text in
 | 
						|
     descriptionText, excluding the null terminator.  The descriptionText
 | 
						|
     field contains the NLM description obtained from the DESCRIPTION
 | 
						|
     keyword in NLMLINK plus the null byte terminator.  The descriptionText
 | 
						|
     can be up to NLM_MAX_DESCRIPTION_LENGTH characters. */
 | 
						|
     
 | 
						|
  unsigned char descriptionLength;
 | 
						|
  char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1];
 | 
						|
 | 
						|
  /* The stackSize field contains the size of the stack in bytes, as
 | 
						|
     specified by the STACK or STACKSIZE keyword in NLMLINK.  If no size
 | 
						|
     is specified, the default is NLM_DEFAULT_STACKSIZE. */
 | 
						|
     
 | 
						|
  long stackSize;
 | 
						|
 | 
						|
  /* The reserved field is included only for completeness.  It should contain
 | 
						|
     zero. */
 | 
						|
 | 
						|
  long reserved;
 | 
						|
 | 
						|
  /* This field is fixed length, should contain " LONG" (note leading
 | 
						|
     space), and is unused. */
 | 
						|
 | 
						|
  char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH];
 | 
						|
 | 
						|
  /* The screenNameLength field contains the length of the actual text stored
 | 
						|
     in the screenName field, excluding the null byte terminator.  The
 | 
						|
     screenName field contains the screen name as specified by the SCREENNAME
 | 
						|
     keyword in NLMLINK, and can be up to NLM_MAX_SCREEN_NAME_LENGTH
 | 
						|
     characters. */
 | 
						|
 | 
						|
  unsigned char screenNameLength;
 | 
						|
  char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1];
 | 
						|
 | 
						|
  /* The threadNameLength field contains the length of the actual text stored
 | 
						|
     in the threadName field, excluding the null byte terminator.  The
 | 
						|
     threadName field contains the thread name as specified by the THREADNAME
 | 
						|
     keyword in NLMLINK, and can be up to NLM_MAX_THREAD_NAME_LENGTH
 | 
						|
     characters. */
 | 
						|
 | 
						|
  unsigned char threadNameLength;
 | 
						|
  char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1];
 | 
						|
 | 
						|
} Nlm_Internal_Variable_Header;
 | 
						|
 | 
						|
#define nlm32_internal_variable_header nlm_internal_variable_header
 | 
						|
#define Nlm32_Internal_Variable_Header Nlm_Internal_Variable_Header
 | 
						|
#define nlm64_internal_variable_header nlm_internal_variable_header
 | 
						|
#define Nlm64_Internal_Variable_Header Nlm_Internal_Variable_Header
 | 
						|
 | 
						|
/* The version header is one of the optional auxiliary headers and
 | 
						|
   follows the fixed length and variable length NLM headers. */
 | 
						|
 | 
						|
typedef struct nlm_internal_version_header
 | 
						|
{
 | 
						|
  /* The header is recognized by "VeRsIoN#" in the stamp field. */
 | 
						|
  char stamp[8];
 | 
						|
  long majorVersion;
 | 
						|
  long minorVersion;
 | 
						|
  long revision;
 | 
						|
  long year;
 | 
						|
  long month;
 | 
						|
  long day;
 | 
						|
} Nlm_Internal_Version_Header;
 | 
						|
 | 
						|
#define nlm32_internal_version_header nlm_internal_version_header
 | 
						|
#define Nlm32_Internal_Version_Header Nlm_Internal_Version_Header
 | 
						|
#define nlm64_internal_version_header nlm_internal_version_header
 | 
						|
#define Nlm64_Internal_Version_Header Nlm_Internal_Version_Header
 | 
						|
 | 
						|
typedef struct nlm_internal_copyright_header
 | 
						|
{
 | 
						|
  /* The header is recognized by "CoPyRiGhT=" in the stamp field. */
 | 
						|
  char stamp[10];
 | 
						|
  unsigned char copyrightMessageLength;
 | 
						|
  char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH];
 | 
						|
} Nlm_Internal_Copyright_Header;
 | 
						|
 | 
						|
#define nlm32_internal_copyright_header nlm_internal_copyright_header
 | 
						|
#define Nlm32_Internal_Copyright_Header Nlm_Internal_Copyright_Header
 | 
						|
#define nlm64_internal_copyright_header nlm_internal_copyright_header
 | 
						|
#define Nlm64_Internal_Copyright_Header Nlm_Internal_Copyright_Header
 | 
						|
 | 
						|
typedef struct nlm_internal_extended_header
 | 
						|
{
 | 
						|
  /* The header is recognized by "MeSsAgEs" in the stamp field. */
 | 
						|
  char stamp[8];
 | 
						|
  long languageID;
 | 
						|
  file_ptr messageFileOffset;
 | 
						|
  bfd_size_type messageFileLength;
 | 
						|
  long messageCount;
 | 
						|
  file_ptr helpFileOffset;
 | 
						|
  bfd_size_type helpFileLength;
 | 
						|
  file_ptr RPCDataOffset;
 | 
						|
  bfd_size_type RPCDataLength;
 | 
						|
  file_ptr sharedCodeOffset;
 | 
						|
  bfd_size_type sharedCodeLength;
 | 
						|
  file_ptr sharedDataOffset;
 | 
						|
  bfd_size_type sharedDataLength;
 | 
						|
  file_ptr sharedRelocationFixupOffset;
 | 
						|
  long sharedRelocationFixupCount;
 | 
						|
  file_ptr sharedExternalReferenceOffset;
 | 
						|
  long sharedExternalReferenceCount;
 | 
						|
  file_ptr sharedPublicsOffset;
 | 
						|
  long sharedPublicsCount;
 | 
						|
  file_ptr sharedDebugRecordOffset;
 | 
						|
  long sharedDebugRecordCount;
 | 
						|
  bfd_vma SharedInitializationOffset;
 | 
						|
  bfd_vma SharedExitProcedureOffset;
 | 
						|
  long productID;
 | 
						|
  long reserved0;
 | 
						|
  long reserved1;
 | 
						|
  long reserved2;
 | 
						|
  long reserved3;
 | 
						|
  long reserved4;
 | 
						|
  long reserved5;
 | 
						|
} Nlm_Internal_Extended_Header;
 | 
						|
 | 
						|
#define nlm32_internal_extended_header nlm_internal_extended_header
 | 
						|
#define Nlm32_Internal_Extended_Header Nlm_Internal_Extended_Header
 | 
						|
#define nlm64_internal_extended_header nlm_internal_extended_header
 | 
						|
#define Nlm64_Internal_Extended_Header Nlm_Internal_Extended_Header
 | 
						|
 | 
						|
/* The format of a custom header as stored internally is different
 | 
						|
   from the external format.  This is how we store a custom header
 | 
						|
   which we do not recognize.  */
 | 
						|
 | 
						|
typedef struct nlm_internal_custom_header
 | 
						|
{
 | 
						|
  /* The header is recognized by "CuStHeAd" in the stamp field. */
 | 
						|
  char stamp[8];
 | 
						|
  bfd_size_type hdrLength;
 | 
						|
  file_ptr dataOffset;
 | 
						|
  bfd_size_type dataLength;
 | 
						|
  char dataStamp[8];
 | 
						|
  void *hdr;
 | 
						|
} Nlm_Internal_Custom_Header;
 | 
						|
 | 
						|
#define nlm32_internal_custom_header nlm_internal_custom_header
 | 
						|
#define Nlm32_Internal_Custom_Header Nlm_Internal_Custom_Header
 | 
						|
#define nlm64_internal_custom_header nlm_internal_custom_header
 | 
						|
#define Nlm64_Internal_Custom_Header Nlm_Internal_Custom_Header
 | 
						|
 | 
						|
/* The internal Cygnus header is written out externally as a custom
 | 
						|
   header.  We don't try to replicate that structure here.  */
 | 
						|
 | 
						|
typedef struct nlm_internal_cygnus_ext_header
 | 
						|
{
 | 
						|
  /* The header is recognized by "CyGnUsEx" in the stamp field. */
 | 
						|
  char stamp[8];
 | 
						|
  /* File location of debugging information.  */
 | 
						|
  file_ptr offset;
 | 
						|
  /* Length of debugging information.  */
 | 
						|
  bfd_size_type length;
 | 
						|
} Nlm_Internal_Cygnus_Ext_Header;
 | 
						|
 | 
						|
#define nlm32_internal_cygnus_ext_header nlm_internal_cygnus_ext_header
 | 
						|
#define Nlm32_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header
 | 
						|
#define nlm64_internal_cygnus_ext_header nlm_internal_cygnus_ext_header
 | 
						|
#define Nlm64_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header
 |