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