summaryrefslogtreecommitdiff
path: root/rts/linker/PEi386.h
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2016-11-02 15:02:13 -0400
committerBen Gamari <ben@smart-cactus.org>2016-11-02 15:42:00 -0400
commit6ea0b4f1a6a0478eeeacb0a7be62e426d4aa58e5 (patch)
tree337c52b79b06b0b79d554096c9e4aac8ac8d1fe4 /rts/linker/PEi386.h
parentc3446c63d64bdc5c2fa627f345c59e893ba0c176 (diff)
downloadhaskell-6ea0b4f1a6a0478eeeacb0a7be62e426d4aa58e5.tar.gz
linker: Split PEi386 implementation into new source file
Test Plan: Validate Reviewers: erikd, austin, simonmar Reviewed By: simonmar Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D2648
Diffstat (limited to 'rts/linker/PEi386.h')
-rw-r--r--rts/linker/PEi386.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/rts/linker/PEi386.h b/rts/linker/PEi386.h
new file mode 100644
index 0000000000..020b84bfec
--- /dev/null
+++ b/rts/linker/PEi386.h
@@ -0,0 +1,161 @@
+#ifndef LINKER_PE_I386_H
+#define LINKER_PE_I386_H
+
+#include "Rts.h"
+#include "LinkerInternals.h"
+#include "PathUtils.h"
+
+#include "BeginPrivate.h"
+
+#if defined(x86_64_HOST_ARCH)
+#define PEi386_IMAGE_OFFSET 4
+#else
+#define PEi386_IMAGE_OFFSET 0
+#endif
+
+void initLinker_PEi386(void);
+const char * addDLL_PEi386(pathchar *dll_name);
+void freePreloadObjectFile_PEi386(ObjectCode *oc);
+
+int findAndLoadImportLibrary(ObjectCode* oc);
+int checkAndLoadImportLibrary( pathchar* arch_name, char* member_name, FILE* f);
+
+pathchar* findSystemLibrary_PEi386(pathchar* dll_name);
+HsPtr addLibrarySearchPath_PEi386(pathchar* dll_path);
+HsBool removeLibrarySearchPath_PEi386(HsPtr dll_path_index);
+
+int ocResolve_PEi386 ( ObjectCode* oc );
+int ocRunInit_PEi386 ( ObjectCode *oc );
+int ocGetNames_PEi386 ( ObjectCode* oc );
+int ocVerifyImage_PEi386 ( ObjectCode* oc );
+SymbolAddr *lookupSymbol_PEi386(SymbolName *lbl);
+int ocAllocateSymbolExtras_PEi386 ( ObjectCode* oc );
+void *lookupSymbolInDLLs ( unsigned char *lbl );
+/* See Note [mingw-w64 name decoration scheme] */
+
+char *
+allocateImageAndTrampolines (
+ pathchar* arch_name, char* member_name,
+ FILE* f,
+ int size,
+ int isThin);
+
+/********************************************
+ * COFF/PE headers
+ ********************************************/
+typedef unsigned char UChar;
+typedef unsigned short UInt16;
+typedef short Int16;
+typedef unsigned int UInt32;
+typedef int Int32;
+typedef unsigned long long int UInt64;
+
+
+typedef
+struct {
+ UInt16 Machine;
+ UInt16 NumberOfSections;
+ UInt32 TimeDateStamp;
+ UInt32 PointerToSymbolTable;
+ UInt32 NumberOfSymbols;
+ UInt16 SizeOfOptionalHeader;
+ UInt16 Characteristics;
+}
+COFF_header;
+
+#define sizeof_COFF_header 20
+
+/* Section 7.1 PE Specification */
+typedef
+struct {
+ UInt16 Sig1;
+ UInt16 Sig2;
+ UInt16 Version;
+ UInt16 Machine;
+ UInt32 TimeDateStamp;
+ UInt32 SizeOfData;
+ UInt16 Ordinal;
+ UInt16 Type_NameType_Reserved;
+}
+COFF_import_header;
+
+#define sizeof_COFF_import_Header 20
+
+typedef
+struct {
+ UChar Name[8];
+ UInt32 VirtualSize;
+ UInt32 VirtualAddress;
+ UInt32 SizeOfRawData;
+ UInt32 PointerToRawData;
+ UInt32 PointerToRelocations;
+ UInt32 PointerToLinenumbers;
+ UInt16 NumberOfRelocations;
+ UInt16 NumberOfLineNumbers;
+ UInt32 Characteristics;
+}
+COFF_section;
+
+#define sizeof_COFF_section 40
+
+
+typedef
+struct {
+ UChar Name[8];
+ UInt32 Value;
+ Int16 SectionNumber;
+ UInt16 Type;
+ UChar StorageClass;
+ UChar NumberOfAuxSymbols;
+}
+COFF_symbol;
+
+#define sizeof_COFF_symbol 18
+
+
+typedef
+struct {
+ UInt32 VirtualAddress;
+ UInt32 SymbolTableIndex;
+ UInt16 Type;
+}
+COFF_reloc;
+
+#define sizeof_COFF_reloc 10
+
+/* From PE spec doc, section 3.3.2 */
+/* Note use of MYIMAGE_* since IMAGE_* are already defined in
+windows.h -- for the same purpose, but I want to know what I'm
+getting, here. */
+#define MYIMAGE_FILE_RELOCS_STRIPPED 0x0001
+#define MYIMAGE_FILE_EXECUTABLE_IMAGE 0x0002
+#define MYIMAGE_FILE_DLL 0x2000
+#define MYIMAGE_FILE_SYSTEM 0x1000
+#define MYIMAGE_FILE_BYTES_REVERSED_HI 0x8000
+#define MYIMAGE_FILE_BYTES_REVERSED_LO 0x0080
+#define MYIMAGE_FILE_32BIT_MACHINE 0x0100
+
+/* From PE spec doc, section 5.4.2 and 5.4.4 */
+#define MYIMAGE_SYM_CLASS_EXTERNAL 2
+#define MYIMAGE_SYM_CLASS_STATIC 3
+#define MYIMAGE_SYM_UNDEFINED 0
+#define MYIMAGE_SYM_CLASS_SECTION 104
+#define MYIMAGE_SYM_CLASS_WEAK_EXTERNAL 105
+
+/* From PE spec doc, section 3.1 */
+#define MYIMAGE_SCN_CNT_CODE 0x00000020
+#define MYIMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
+#define MYIMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
+#define MYIMAGE_SCN_LNK_COMDAT 0x00001000
+#define MYIMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
+#define MYIMAGE_SCN_LNK_REMOVE 0x00000800
+#define MYIMAGE_SCN_MEM_DISCARDABLE 0x02000000
+
+/* From PE spec doc, section 5.2.1 */
+#define MYIMAGE_REL_I386_DIR32 0x0006
+#define MYIMAGE_REL_I386_DIR32NB 0x0007
+#define MYIMAGE_REL_I386_REL32 0x0014
+
+#include "EndPrivate.h"
+
+#endif /* LINKER_PE_I386_H */