summaryrefslogtreecommitdiff
path: root/rts/LinkerInternals.h
diff options
context:
space:
mode:
authorMoritz Angermann <moritz.angermann@gmail.com>2017-03-21 10:59:49 -0400
committerBen Gamari <ben@smart-cactus.org>2017-03-26 21:37:22 -0400
commit8ed29b50376856018dfbbcbd6d728c69af0c9f29 (patch)
treeaac472b4456e3d5268ea7108ddc347426fe75d20 /rts/LinkerInternals.h
parentfdbbd63db18cf3ba0cd8f0d61da904317ae5ae01 (diff)
downloadhaskell-8ed29b50376856018dfbbcbd6d728c69af0c9f29.tar.gz
rts linker: Introduce MachOTypes
This diff introduces MachOTypes, to reduce the need to typing `struct` all the time. It also coaleces the 64 and non 64 structs. It also adds additional fiedls to the object code structure for macho, which makes working with macho object code much simpler and requires less passing around of variabls or address recomputation for the header, symbol table, etc... Furthermore this diff introduces a type for a linked list of stubs. I had to move the #ifdef from the bottom of the file up, to be able to extend the object code structure conditional on the use of the macho file format. This is just one of the pieces for the rts linker support for ios (aarch64-macho) --- The following diagram and legend tries to explain the dependencies a bit: ``` .- D3240 v D3255 <- D3252 <- D3251 <- This ^ '- D3238 ``` - In D3238 we started allowing preloading object code with mmap in iOS, where we can't have r+w+x. - In D3239 we introduced a richer extension of the object code data type to make working with mach-o files easier. - In D3240 we set the stage to allow loading archives (.a) on iOS - In D3251 we added init and deinit functions to populate and depopulate the enriched object code data structure for mach-o files. - In D3252 we refactored most of the MachO.c file to use the new types and data structure. - in D3255 we finally introduce the aarch64-mach-o linker. Reviewers: austin, erikd, simonmar, rwbarton, bgamari Subscribers: rwbarton, thomie, ryantrinkle Differential Revision: https://phabricator.haskell.org/D3239
Diffstat (limited to 'rts/LinkerInternals.h')
-rw-r--r--rts/LinkerInternals.h28
1 files changed, 26 insertions, 2 deletions
diff --git a/rts/LinkerInternals.h b/rts/LinkerInternals.h
index 76497df257..2217c5e61b 100644
--- a/rts/LinkerInternals.h
+++ b/rts/LinkerInternals.h
@@ -21,6 +21,9 @@
typedef void SymbolAddr;
typedef char SymbolName;
+typedef struct _SectionFormatInfo SectionFormatInfo;
+typedef struct _ObjectCodeFormatInfo ObjectCodeFormatInfo;
+
/* See Linker.c Note [runtime-linker-phases] */
typedef enum {
OBJECT_LOADED,
@@ -63,6 +66,9 @@ typedef
StgWord mapped_offset; /* offset from the image of mapped_start */
void* mapped_start; /* start of mmap() block */
StgWord mapped_size; /* size of mmap() block */
+
+ /* A customizable type to augment the Section type. */
+ SectionFormatInfo* info;
}
Section;
@@ -86,7 +92,10 @@ typedef struct ForeignExportStablePtr_ {
} ForeignExportStablePtr;
#if powerpc_HOST_ARCH || x86_64_HOST_ARCH || arm_HOST_ARCH
+/* ios currently uses adjacent got tables, and no symbol extras */
+#if !defined(ios_HOST_OS)
#define NEED_SYMBOL_EXTRAS 1
+#endif /* ios_HOST_OS */
#endif
/* Jump Islands are sniplets of machine code required for relative
@@ -132,6 +141,10 @@ typedef struct _ObjectCode {
/* ptr to mem containing the object file image */
char* image;
+
+ /* A customizable type, that formats can use to augment ObjectCode */
+ ObjectCodeFormatInfo *info;
+
/* non-zero if the object file was mmap'd, otherwise malloc'd */
int imageMapped;
@@ -299,12 +312,23 @@ char *cstring_from_section_name(
#endif
/* Which object file format are we targetting? */
-#if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(gnu_HOST_OS)
+#if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) \
+|| defined(linux_android_HOST_OS) \
+|| defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) \
+|| defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) \
+|| defined(openbsd_HOST_OS) || defined(gnu_HOST_OS)
# define OBJFORMAT_ELF
+typedef struct _ObjectCodeFormatInfo { void* placeholder;} ObjectCodeFormatInfo;
+typedef struct _SectionFormatInfo { void* placeholder; } SectionFormatInfo;
#elif defined (mingw32_HOST_OS)
# define OBJFORMAT_PEi386
-#elif defined(darwin_HOST_OS)
+typedef struct _ObjectCodeFormatInfo { void* placeholder;} ObjectCodeFormatInfo;
+typedef struct _SectionFormatInfo { void* placeholder; } SectionFormatInfo;
+#elif defined(darwin_HOST_OS) || defined(ios_HOST_OS)
# define OBJFORMAT_MACHO
+# include "linker/MachOTypes.h"
+#else
+#error "Unknown OBJECT_FORMAT for HOST_OS"
#endif
/* In order to simplify control flow a bit, some references to mmap-related