1*53ee8cc1Swenshuai.xi #ifndef __A_OUT_GNU_H__ 2*53ee8cc1Swenshuai.xi #define __A_OUT_GNU_H__ 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi #define __GNU_EXEC_MACROS__ 5*53ee8cc1Swenshuai.xi 6*53ee8cc1Swenshuai.xi #ifndef __STRUCT_EXEC_OVERRIDE__ 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi #include <asm/a.out.h> 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xi #endif /* __STRUCT_EXEC_OVERRIDE__ */ 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi #ifndef __ASSEMBLY__ 13*53ee8cc1Swenshuai.xi 14*53ee8cc1Swenshuai.xi /* these go in the N_MACHTYPE field */ 15*53ee8cc1Swenshuai.xi enum machine_type { 16*53ee8cc1Swenshuai.xi #if defined (M_OLDSUN2) 17*53ee8cc1Swenshuai.xi M__OLDSUN2 = M_OLDSUN2, 18*53ee8cc1Swenshuai.xi #else 19*53ee8cc1Swenshuai.xi M_OLDSUN2 = 0, 20*53ee8cc1Swenshuai.xi #endif 21*53ee8cc1Swenshuai.xi #if defined (M_68010) 22*53ee8cc1Swenshuai.xi M__68010 = M_68010, 23*53ee8cc1Swenshuai.xi #else 24*53ee8cc1Swenshuai.xi M_68010 = 1, 25*53ee8cc1Swenshuai.xi #endif 26*53ee8cc1Swenshuai.xi #if defined (M_68020) 27*53ee8cc1Swenshuai.xi M__68020 = M_68020, 28*53ee8cc1Swenshuai.xi #else 29*53ee8cc1Swenshuai.xi M_68020 = 2, 30*53ee8cc1Swenshuai.xi #endif 31*53ee8cc1Swenshuai.xi #if defined (M_SPARC) 32*53ee8cc1Swenshuai.xi M__SPARC = M_SPARC, 33*53ee8cc1Swenshuai.xi #else 34*53ee8cc1Swenshuai.xi M_SPARC = 3, 35*53ee8cc1Swenshuai.xi #endif 36*53ee8cc1Swenshuai.xi /* skip a bunch so we don't run into any of sun's numbers */ 37*53ee8cc1Swenshuai.xi M_386 = 100, 38*53ee8cc1Swenshuai.xi M_MIPS1 = 151, /* MIPS R3000/R3000 binary */ 39*53ee8cc1Swenshuai.xi M_MIPS2 = 152 /* MIPS R6000/R4000 binary */ 40*53ee8cc1Swenshuai.xi }; 41*53ee8cc1Swenshuai.xi 42*53ee8cc1Swenshuai.xi #if !defined (N_MAGIC) 43*53ee8cc1Swenshuai.xi #define N_MAGIC(exec) ((exec).a_info & 0xffff) 44*53ee8cc1Swenshuai.xi #endif 45*53ee8cc1Swenshuai.xi #define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) 46*53ee8cc1Swenshuai.xi #define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) 47*53ee8cc1Swenshuai.xi #define N_SET_INFO(exec, magic, type, flags) \ 48*53ee8cc1Swenshuai.xi ((exec).a_info = ((magic) & 0xffff) \ 49*53ee8cc1Swenshuai.xi | (((int)(type) & 0xff) << 16) \ 50*53ee8cc1Swenshuai.xi | (((flags) & 0xff) << 24)) 51*53ee8cc1Swenshuai.xi #define N_SET_MAGIC(exec, magic) \ 52*53ee8cc1Swenshuai.xi ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi #define N_SET_MACHTYPE(exec, machtype) \ 55*53ee8cc1Swenshuai.xi ((exec).a_info = \ 56*53ee8cc1Swenshuai.xi ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) 57*53ee8cc1Swenshuai.xi 58*53ee8cc1Swenshuai.xi #define N_SET_FLAGS(exec, flags) \ 59*53ee8cc1Swenshuai.xi ((exec).a_info = \ 60*53ee8cc1Swenshuai.xi ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi /* Code indicating object file or impure executable. */ 63*53ee8cc1Swenshuai.xi #define OMAGIC 0407 64*53ee8cc1Swenshuai.xi /* Code indicating pure executable. */ 65*53ee8cc1Swenshuai.xi #define NMAGIC 0410 66*53ee8cc1Swenshuai.xi /* Code indicating demand-paged executable. */ 67*53ee8cc1Swenshuai.xi #define ZMAGIC 0413 68*53ee8cc1Swenshuai.xi /* This indicates a demand-paged executable with the header in the text. 69*53ee8cc1Swenshuai.xi The first page is unmapped to help trap NULL pointer references */ 70*53ee8cc1Swenshuai.xi #define QMAGIC 0314 71*53ee8cc1Swenshuai.xi 72*53ee8cc1Swenshuai.xi /* Code indicating core file. */ 73*53ee8cc1Swenshuai.xi #define CMAGIC 0421 74*53ee8cc1Swenshuai.xi 75*53ee8cc1Swenshuai.xi #if !defined (N_BADMAG) 76*53ee8cc1Swenshuai.xi #define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ 77*53ee8cc1Swenshuai.xi && N_MAGIC(x) != NMAGIC \ 78*53ee8cc1Swenshuai.xi && N_MAGIC(x) != ZMAGIC \ 79*53ee8cc1Swenshuai.xi && N_MAGIC(x) != QMAGIC) 80*53ee8cc1Swenshuai.xi #endif 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi #define _N_HDROFF(x) (1024 - sizeof (struct exec)) 83*53ee8cc1Swenshuai.xi 84*53ee8cc1Swenshuai.xi #if !defined (N_TXTOFF) 85*53ee8cc1Swenshuai.xi #define N_TXTOFF(x) \ 86*53ee8cc1Swenshuai.xi (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : \ 87*53ee8cc1Swenshuai.xi (N_MAGIC(x) == QMAGIC ? 0 : sizeof (struct exec))) 88*53ee8cc1Swenshuai.xi #endif 89*53ee8cc1Swenshuai.xi 90*53ee8cc1Swenshuai.xi #if !defined (N_DATOFF) 91*53ee8cc1Swenshuai.xi #define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) 92*53ee8cc1Swenshuai.xi #endif 93*53ee8cc1Swenshuai.xi 94*53ee8cc1Swenshuai.xi #if !defined (N_TRELOFF) 95*53ee8cc1Swenshuai.xi #define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) 96*53ee8cc1Swenshuai.xi #endif 97*53ee8cc1Swenshuai.xi 98*53ee8cc1Swenshuai.xi #if !defined (N_DRELOFF) 99*53ee8cc1Swenshuai.xi #define N_DRELOFF(x) (N_TRELOFF(x) + N_TRSIZE(x)) 100*53ee8cc1Swenshuai.xi #endif 101*53ee8cc1Swenshuai.xi 102*53ee8cc1Swenshuai.xi #if !defined (N_SYMOFF) 103*53ee8cc1Swenshuai.xi #define N_SYMOFF(x) (N_DRELOFF(x) + N_DRSIZE(x)) 104*53ee8cc1Swenshuai.xi #endif 105*53ee8cc1Swenshuai.xi 106*53ee8cc1Swenshuai.xi #if !defined (N_STROFF) 107*53ee8cc1Swenshuai.xi #define N_STROFF(x) (N_SYMOFF(x) + N_SYMSIZE(x)) 108*53ee8cc1Swenshuai.xi #endif 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi /* Address of text segment in memory after it is loaded. */ 111*53ee8cc1Swenshuai.xi #if !defined (N_TXTADDR) 112*53ee8cc1Swenshuai.xi #define N_TXTADDR(x) (N_MAGIC(x) == QMAGIC ? PAGE_SIZE : 0) 113*53ee8cc1Swenshuai.xi #endif 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi /* Address of data segment in memory after it is loaded. 116*53ee8cc1Swenshuai.xi Note that it is up to you to define SEGMENT_SIZE 117*53ee8cc1Swenshuai.xi on machines not listed here. */ 118*53ee8cc1Swenshuai.xi #if defined(vax) || defined(hp300) || defined(pyr) 119*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE page_size 120*53ee8cc1Swenshuai.xi #endif 121*53ee8cc1Swenshuai.xi #ifdef sony 122*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE 0x2000 123*53ee8cc1Swenshuai.xi #endif /* Sony. */ 124*53ee8cc1Swenshuai.xi #ifdef is68k 125*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE 0x20000 126*53ee8cc1Swenshuai.xi #endif 127*53ee8cc1Swenshuai.xi #if defined(m68k) && defined(PORTAR) 128*53ee8cc1Swenshuai.xi #define PAGE_SIZE 0x400 129*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE PAGE_SIZE 130*53ee8cc1Swenshuai.xi #endif 131*53ee8cc1Swenshuai.xi 132*53ee8cc1Swenshuai.xi #include <unistd.h> 133*53ee8cc1Swenshuai.xi #if defined(__i386__) || defined(__mc68000__) 134*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE 1024 135*53ee8cc1Swenshuai.xi #else 136*53ee8cc1Swenshuai.xi #ifndef SEGMENT_SIZE 137*53ee8cc1Swenshuai.xi #define SEGMENT_SIZE getpagesize() 138*53ee8cc1Swenshuai.xi #endif 139*53ee8cc1Swenshuai.xi #endif 140*53ee8cc1Swenshuai.xi 141*53ee8cc1Swenshuai.xi #define _N_SEGMENT_ROUND(x) ALIGN(x, SEGMENT_SIZE) 142*53ee8cc1Swenshuai.xi 143*53ee8cc1Swenshuai.xi #define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) 144*53ee8cc1Swenshuai.xi 145*53ee8cc1Swenshuai.xi #ifndef N_DATADDR 146*53ee8cc1Swenshuai.xi #define N_DATADDR(x) \ 147*53ee8cc1Swenshuai.xi (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ 148*53ee8cc1Swenshuai.xi : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) 149*53ee8cc1Swenshuai.xi #endif 150*53ee8cc1Swenshuai.xi 151*53ee8cc1Swenshuai.xi /* Address of bss segment in memory after it is loaded. */ 152*53ee8cc1Swenshuai.xi #if !defined (N_BSSADDR) 153*53ee8cc1Swenshuai.xi #define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) 154*53ee8cc1Swenshuai.xi #endif 155*53ee8cc1Swenshuai.xi 156*53ee8cc1Swenshuai.xi #if !defined (N_NLIST_DECLARED) 157*53ee8cc1Swenshuai.xi struct nlist { 158*53ee8cc1Swenshuai.xi union { 159*53ee8cc1Swenshuai.xi char *n_name; 160*53ee8cc1Swenshuai.xi struct nlist *n_next; 161*53ee8cc1Swenshuai.xi long n_strx; 162*53ee8cc1Swenshuai.xi } n_un; 163*53ee8cc1Swenshuai.xi unsigned char n_type; 164*53ee8cc1Swenshuai.xi char n_other; 165*53ee8cc1Swenshuai.xi short n_desc; 166*53ee8cc1Swenshuai.xi unsigned long n_value; 167*53ee8cc1Swenshuai.xi }; 168*53ee8cc1Swenshuai.xi #endif /* no N_NLIST_DECLARED. */ 169*53ee8cc1Swenshuai.xi 170*53ee8cc1Swenshuai.xi #if !defined (N_UNDF) 171*53ee8cc1Swenshuai.xi #define N_UNDF 0 172*53ee8cc1Swenshuai.xi #endif 173*53ee8cc1Swenshuai.xi #if !defined (N_ABS) 174*53ee8cc1Swenshuai.xi #define N_ABS 2 175*53ee8cc1Swenshuai.xi #endif 176*53ee8cc1Swenshuai.xi #if !defined (N_TEXT) 177*53ee8cc1Swenshuai.xi #define N_TEXT 4 178*53ee8cc1Swenshuai.xi #endif 179*53ee8cc1Swenshuai.xi #if !defined (N_DATA) 180*53ee8cc1Swenshuai.xi #define N_DATA 6 181*53ee8cc1Swenshuai.xi #endif 182*53ee8cc1Swenshuai.xi #if !defined (N_BSS) 183*53ee8cc1Swenshuai.xi #define N_BSS 8 184*53ee8cc1Swenshuai.xi #endif 185*53ee8cc1Swenshuai.xi #if !defined (N_FN) 186*53ee8cc1Swenshuai.xi #define N_FN 15 187*53ee8cc1Swenshuai.xi #endif 188*53ee8cc1Swenshuai.xi 189*53ee8cc1Swenshuai.xi #if !defined (N_EXT) 190*53ee8cc1Swenshuai.xi #define N_EXT 1 191*53ee8cc1Swenshuai.xi #endif 192*53ee8cc1Swenshuai.xi #if !defined (N_TYPE) 193*53ee8cc1Swenshuai.xi #define N_TYPE 036 194*53ee8cc1Swenshuai.xi #endif 195*53ee8cc1Swenshuai.xi #if !defined (N_STAB) 196*53ee8cc1Swenshuai.xi #define N_STAB 0340 197*53ee8cc1Swenshuai.xi #endif 198*53ee8cc1Swenshuai.xi 199*53ee8cc1Swenshuai.xi /* The following type indicates the definition of a symbol as being 200*53ee8cc1Swenshuai.xi an indirect reference to another symbol. The other symbol 201*53ee8cc1Swenshuai.xi appears as an undefined reference, immediately following this symbol. 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi Indirection is asymmetrical. The other symbol's value will be used 204*53ee8cc1Swenshuai.xi to satisfy requests for the indirect symbol, but not vice versa. 205*53ee8cc1Swenshuai.xi If the other symbol does not have a definition, libraries will 206*53ee8cc1Swenshuai.xi be searched to find a definition. */ 207*53ee8cc1Swenshuai.xi #define N_INDR 0xa 208*53ee8cc1Swenshuai.xi 209*53ee8cc1Swenshuai.xi /* The following symbols refer to set elements. 210*53ee8cc1Swenshuai.xi All the N_SET[ATDB] symbols with the same name form one set. 211*53ee8cc1Swenshuai.xi Space is allocated for the set in the text section, and each set 212*53ee8cc1Swenshuai.xi element's value is stored into one word of the space. 213*53ee8cc1Swenshuai.xi The first word of the space is the length of the set (number of elements). 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi The address of the set is made into an N_SETV symbol 216*53ee8cc1Swenshuai.xi whose name is the same as the name of the set. 217*53ee8cc1Swenshuai.xi This symbol acts like a N_DATA global symbol 218*53ee8cc1Swenshuai.xi in that it can satisfy undefined external references. */ 219*53ee8cc1Swenshuai.xi 220*53ee8cc1Swenshuai.xi /* These appear as input to LD, in a .o file. */ 221*53ee8cc1Swenshuai.xi #define N_SETA 0x14 /* Absolute set element symbol */ 222*53ee8cc1Swenshuai.xi #define N_SETT 0x16 /* Text set element symbol */ 223*53ee8cc1Swenshuai.xi #define N_SETD 0x18 /* Data set element symbol */ 224*53ee8cc1Swenshuai.xi #define N_SETB 0x1A /* Bss set element symbol */ 225*53ee8cc1Swenshuai.xi 226*53ee8cc1Swenshuai.xi /* This is output from LD. */ 227*53ee8cc1Swenshuai.xi #define N_SETV 0x1C /* Pointer to set vector in data area. */ 228*53ee8cc1Swenshuai.xi 229*53ee8cc1Swenshuai.xi #if !defined (N_RELOCATION_INFO_DECLARED) 230*53ee8cc1Swenshuai.xi /* This structure describes a single relocation to be performed. 231*53ee8cc1Swenshuai.xi The text-relocation section of the file is a vector of these structures, 232*53ee8cc1Swenshuai.xi all of which apply to the text section. 233*53ee8cc1Swenshuai.xi Likewise, the data-relocation section applies to the data section. */ 234*53ee8cc1Swenshuai.xi 235*53ee8cc1Swenshuai.xi struct relocation_info 236*53ee8cc1Swenshuai.xi { 237*53ee8cc1Swenshuai.xi /* Address (within segment) to be relocated. */ 238*53ee8cc1Swenshuai.xi int r_address; 239*53ee8cc1Swenshuai.xi /* The meaning of r_symbolnum depends on r_extern. */ 240*53ee8cc1Swenshuai.xi unsigned int r_symbolnum:24; 241*53ee8cc1Swenshuai.xi /* Nonzero means value is a pc-relative offset 242*53ee8cc1Swenshuai.xi and it should be relocated for changes in its own address 243*53ee8cc1Swenshuai.xi as well as for changes in the symbol or section specified. */ 244*53ee8cc1Swenshuai.xi unsigned int r_pcrel:1; 245*53ee8cc1Swenshuai.xi /* Length (as exponent of 2) of the field to be relocated. 246*53ee8cc1Swenshuai.xi Thus, a value of 2 indicates 1<<2 bytes. */ 247*53ee8cc1Swenshuai.xi unsigned int r_length:2; 248*53ee8cc1Swenshuai.xi /* 1 => relocate with value of symbol. 249*53ee8cc1Swenshuai.xi r_symbolnum is the index of the symbol 250*53ee8cc1Swenshuai.xi in file's the symbol table. 251*53ee8cc1Swenshuai.xi 0 => relocate with the address of a segment. 252*53ee8cc1Swenshuai.xi r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS 253*53ee8cc1Swenshuai.xi (the N_EXT bit may be set also, but signifies nothing). */ 254*53ee8cc1Swenshuai.xi unsigned int r_extern:1; 255*53ee8cc1Swenshuai.xi /* Four bits that aren't used, but when writing an object file 256*53ee8cc1Swenshuai.xi it is desirable to clear them. */ 257*53ee8cc1Swenshuai.xi #ifdef NS32K 258*53ee8cc1Swenshuai.xi unsigned r_bsr:1; 259*53ee8cc1Swenshuai.xi unsigned r_disp:1; 260*53ee8cc1Swenshuai.xi unsigned r_pad:2; 261*53ee8cc1Swenshuai.xi #else 262*53ee8cc1Swenshuai.xi unsigned int r_pad:4; 263*53ee8cc1Swenshuai.xi #endif 264*53ee8cc1Swenshuai.xi }; 265*53ee8cc1Swenshuai.xi #endif /* no N_RELOCATION_INFO_DECLARED. */ 266*53ee8cc1Swenshuai.xi 267*53ee8cc1Swenshuai.xi #endif /*__ASSEMBLY__ */ 268*53ee8cc1Swenshuai.xi #endif /* __A_OUT_GNU_H__ */ 269