LinkerInternals.h 3.25 KB
Newer Older
1 2 3 4 5 6 7 8
/* -----------------------------------------------------------------------------
 *
 * (c) The GHC Team, 2000
 *
 * RTS Object Linker
 *
 * ---------------------------------------------------------------------------*/

9 10 11
#ifndef LINKERINTERNALS_H
#define LINKERINTERNALS_H

12 13 14 15 16 17
typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus;

/* Indication of section kinds for loaded objects.  Needed by
   the GC for deciding whether or not a pointer on the stack
   is a code pointer.
*/
18 19 20 21 22
typedef 
   enum { SECTIONKIND_CODE_OR_RODATA,
          SECTIONKIND_RWDATA,
          SECTIONKIND_OTHER,
          SECTIONKIND_NOINFOAVAIL } 
23 24
   SectionKind;

25 26 27 28 29 30 31
typedef 
   struct _Section { 
      void* start; 
      void* end; 
      SectionKind kind;
      struct _Section* next;
   } 
32 33
   Section;

34 35 36 37 38 39 40 41
typedef 
   struct _ProddableBlock {
      void* start;
      int   size;
      struct _ProddableBlock* next;
   }
   ProddableBlock;

42 43 44 45
/* Jump Islands are sniplets of machine code required for relative
 * address relocations on the PowerPC.
 */
typedef struct {
46 47 48 49 50 51 52
#ifdef powerpc_HOST_ARCH
    struct {
        short lis_r12, hi_addr;
        short ori_r12_r12, lo_addr;
        long mtctr_r12;
        long bctr;
    } jumpIsland;
53
#elif x86_64_HOST_ARCH
54 55
    uint64_t    addr;
    uint8_t     jumpIsland[6];
56
#endif
57
} SymbolExtra;
58

59 60 61 62
/* Top-level structure for an object module.  One of these is allocated
 * for each object file in use.
 */
typedef struct _ObjectCode {
63 64 65 66
    OStatus    status;
    char*      fileName;
    int        fileSize;
    char*      formatName;            /* eg "ELF32", "DLL", "COFF", etc. */
67

68 69 70 71 72
    /* If this object is a member of an archive, archiveMemberName is
     * like "libarchive.a(object.o)". Otherwise it's NULL.
     */
    char*      archiveMemberName;

73 74 75 76 77
    /* An array containing ptrs to all the symbol names copied from
       this object into the global symbol hash table.  This is so that
       we know which parts of the latter mapping to nuke when this
       object is removed from the system. */
    char**     symbols;
78
    int        n_symbols;
79 80

    /* ptr to malloc'd lump of memory holding the obj file */
81
    char*      image;
82

83 84 85 86 87 88
#ifdef darwin_HOST_OS
    /* record by how much image has been deliberately misaligned
       after allocation, so that we can use realloc */
    int        misalignment;
#endif

89 90 91
    /* The section-kind entries for this object module.  Linked
       list. */
    Section* sections;
92

93 94
    /* Allow a chain of these things */
    struct _ObjectCode * next;
95 96 97 98 99

    /* SANITY CHECK ONLY: a list of the only memory regions which may
       safely be prodded during relocation.  Any attempt to prod
       outside one of these is an error in the linker. */
    ProddableBlock* proddables;
100

101
#ifdef ia64_HOST_ARCH
102 103 104 105 106
    /* Procedure Linkage Table for this object */
    void *plt;
    unsigned int pltIndex;
#endif

107 108 109 110
#if powerpc_HOST_ARCH || x86_64_HOST_ARCH
    SymbolExtra    *symbol_extras;
    unsigned long   first_symbol_extra;
    unsigned long   n_symbol_extras;
111 112
#endif

113 114
} ObjectCode;

115 116 117 118 119 120
#define OC_INFORMATIVE_FILENAME(OC)             \
    ( (OC)->archiveMemberName ?                 \
      (OC)->archiveMemberName :                 \
      (OC)->fileName                            \
    )

121
extern ObjectCode *objects;
122

123 124
void exitLinker( void );

125
#endif /* LINKERINTERNALS_H */