1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: fixup related variables and routines
*
****************************************************************************/
#ifndef FIXUP_H
#define FIXUP_H
/* RELOFF8 - RELOFF32 must be consecutive */
enum fixup_types {
FIX_VOID = 0, /* 0, fixup is to be ignored */
FIX_RELOFF8, /* 1, 1 byte */
FIX_RELOFF16, /* 2, 2 byte */
FIX_RELOFF32, /* 3, 4 byte */
FIX_OFF8, /* 4, 1 byte, OMF, BIN + GNU-ELF only */
FIX_OFF16, /* 5, 2 byte */
FIX_OFF32, /* 6, 4 byte */
FIX_OFF64, /* 7, 8 byte, COFF64, ELF64 + BIN only */
FIX_SEG = 8, /* 8, 2 byte */
FIX_PTR16, /* 9, 4 byte, OMF+BIN-MZ only */
FIX_PTR32, /* 10, 6 byte, OMF+BIN-MZ only */
FIX_HIBYTE, /* 11, 1 byte, OMF+BIN-MZ only */
FIX_OFF32_IMGREL, /* 12, 4 byte, COFF+ELF only */
FIX_OFF32_SECREL, /* 13, 4 byte, COFF+ELF only */
FIX_GOTPCREL64, /* 14, 4 byte, GOT table RIP relative ELF64/MACHO only */
FIX_GOT64, /* 15, 4 byte, GOT table RIP relative */
FIX_PLT64, /* 16, 4 byte, GOT.PLT table RIP relative */
FIX_LAST
};
/* OMF: nothing (7, 12, 13 can't happen)
* COFF: set bit 1, 4, 9, 10, 11
* ELF: set bit 8, 9, 10, 11
*/
#if BIN_SUPPORT
#define BIN_DISALLOWED 0x0000
#endif
#define OMF_DISALLOWED 0x0000
#if COFF_SUPPORT
/* exclude RELOFF8, OFF8, PTR16, PTR32, HIBYTE */
#define COFF32_DISALLOWED 0x0E12
/* exclude RELOFF8, OFF8, PTR16, PTR32, HIBYTE */
#define COFF64_DISALLOWED 0x0E12
#endif
#if ELF_SUPPORT
/* exclude SEG, PTR16, PTR32, HIBYTE */
#define ELF32_DISALLOWED 0x0F00
/* exclude SEG, PTR16, PTR32, HIBYTE */
#define ELF64_DISALLOWED 0x0F00
#endif
#if MACHO_SUPPORT
/* exclude SEG, PTR16, PTR32, HIBYTE */
#define MACHO32_DISALLOWED 0x0F00
/* exclude SEG, PTR16, PTR32, HIBYTE */
#define MACHO64_DISALLOWED 0x0F00
#endif
/* fixups are also used for backpatching of forward references in pass one.
* the instructions which depend on the distance are CALL, JMP, PUSH <imm>.
* OPTJ_EXPLICIT: JMP SHORT <label> or Jcc SHORT <label>, size cannot change
* OPTJ_EXTEND: Jcc <label> for cpu < 80386, size may change (2 -> 5/7 or 8/10)
* OPTJ_JXX: Jcc <label> for cpu >= 80386, size may change (2 -> 5 )
* OPTJ_CALL: call <label>, may become push cs, call NEAR or call FAR
* OPTJ_PUSH: push <label>, assumed byte, may become variable or label.
*/
enum fixup_options {
OPTJ_NONE, /* normal jump */
OPTJ_EXPLICIT,
OPTJ_EXTEND,
OPTJ_JXX,
OPTJ_CALL,
OPTJ_PUSH /* PUSH */
};
struct fixup {
struct fixup *nextbp; /* PASS 1: linked list backpatch */
struct fixup *nextrlc; /* PASS >1: linked list relocs */
#ifdef TRMEM
uint_16 marker;
#endif
uint_32 offset; /* symbol's offset */
uint_32 locofs; /* location of fixup */
enum fixup_types type;
enum fixup_options option;
union {
uint_16 flags;
struct {
#if AMD64_SUPPORT
/* the IP relative addressing needs to know where the instruction ends.
* the result <end of instruction> - <fixup location> is stored here. */
uint_8 addbytes;
#endif
unsigned char loader_resolved:1; /* operator LROFFSET */
unsigned char orgoccured:1; /* v2.04 ORG occured behind this fix */
};
};
union {
struct {
int_8 frame_type; /* frame specifier (SEG=0,GRP=1,,...) */
uint_16 frame_datum; /* additional data, usually index */
};
struct asym *segment_var; /* symbol's segment if assembly time var */
};
struct dsym *def_seg; /* segment the fixup is in - pass 1 only */
struct asym *sym;
};
extern struct fixup *CreateFixup( struct asym *sym, enum fixup_types fixup_type, enum fixup_options fixup_option );
extern void SetFixupFrame( const struct asym *sym, char );
extern void FreeFixup( struct fixup * );
extern void store_fixup( struct fixup *, struct dsym *, int_32 * );
extern ret_code BackPatch( struct asym *sym );
#endif