1*a9fa9459Szrj /* `a.out' object-file definitions, including extensions to 64-bit fields 2*a9fa9459Szrj 3*a9fa9459Szrj Copyright (C) 1999-2016 Free Software Foundation, Inc. 4*a9fa9459Szrj 5*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 6*a9fa9459Szrj it under the terms of the GNU General Public License as published by 7*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 8*a9fa9459Szrj (at your option) any later version. 9*a9fa9459Szrj 10*a9fa9459Szrj This program is distributed in the hope that it will be useful, 11*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 12*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*a9fa9459Szrj GNU General Public License for more details. 14*a9fa9459Szrj 15*a9fa9459Szrj You should have received a copy of the GNU General Public License 16*a9fa9459Szrj along with this program; if not, write to the Free Software 17*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 18*a9fa9459Szrj MA 02110-1301, USA. */ 19*a9fa9459Szrj 20*a9fa9459Szrj #ifndef __A_OUT_64_H__ 21*a9fa9459Szrj #define __A_OUT_64_H__ 22*a9fa9459Szrj 23*a9fa9459Szrj #ifndef BYTES_IN_WORD 24*a9fa9459Szrj #define BYTES_IN_WORD 4 25*a9fa9459Szrj #endif 26*a9fa9459Szrj 27*a9fa9459Szrj /* This is the layout on disk of the 32-bit or 64-bit exec header. */ 28*a9fa9459Szrj 29*a9fa9459Szrj #ifndef external_exec 30*a9fa9459Szrj struct external_exec 31*a9fa9459Szrj { 32*a9fa9459Szrj bfd_byte e_info[4]; /* Magic number and stuff. */ 33*a9fa9459Szrj bfd_byte e_text[BYTES_IN_WORD]; /* Length of text section in bytes. */ 34*a9fa9459Szrj bfd_byte e_data[BYTES_IN_WORD]; /* Length of data section in bytes. */ 35*a9fa9459Szrj bfd_byte e_bss[BYTES_IN_WORD]; /* Length of bss area in bytes. */ 36*a9fa9459Szrj bfd_byte e_syms[BYTES_IN_WORD]; /* Length of symbol table in bytes. */ 37*a9fa9459Szrj bfd_byte e_entry[BYTES_IN_WORD]; /* Start address. */ 38*a9fa9459Szrj bfd_byte e_trsize[BYTES_IN_WORD]; /* Length of text relocation info. */ 39*a9fa9459Szrj bfd_byte e_drsize[BYTES_IN_WORD]; /* Length of data relocation info. */ 40*a9fa9459Szrj }; 41*a9fa9459Szrj 42*a9fa9459Szrj #define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) 43*a9fa9459Szrj 44*a9fa9459Szrj /* Magic numbers for a.out files. */ 45*a9fa9459Szrj 46*a9fa9459Szrj #if ARCH_SIZE==64 47*a9fa9459Szrj #define OMAGIC 0x1001 /* Code indicating object file. */ 48*a9fa9459Szrj #define ZMAGIC 0x1002 /* Code indicating demand-paged executable. */ 49*a9fa9459Szrj #define NMAGIC 0x1003 /* Code indicating pure executable. */ 50*a9fa9459Szrj 51*a9fa9459Szrj /* There is no 64-bit QMAGIC as far as I know. */ 52*a9fa9459Szrj 53*a9fa9459Szrj #define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ 54*a9fa9459Szrj && N_MAGIC(x) != NMAGIC \ 55*a9fa9459Szrj && N_MAGIC(x) != ZMAGIC) 56*a9fa9459Szrj #else 57*a9fa9459Szrj #define OMAGIC 0407 /* Object file or impure executable. */ 58*a9fa9459Szrj #define NMAGIC 0410 /* Code indicating pure executable. */ 59*a9fa9459Szrj #define ZMAGIC 0413 /* Code indicating demand-paged executable. */ 60*a9fa9459Szrj #define BMAGIC 0415 /* Used by a b.out object. */ 61*a9fa9459Szrj 62*a9fa9459Szrj /* This indicates a demand-paged executable with the header in the text. 63*a9fa9459Szrj It is used by 386BSD (and variants) and Linux, at least. */ 64*a9fa9459Szrj #ifndef QMAGIC 65*a9fa9459Szrj #define QMAGIC 0314 66*a9fa9459Szrj #endif 67*a9fa9459Szrj # ifndef N_BADMAG 68*a9fa9459Szrj # define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ 69*a9fa9459Szrj && N_MAGIC(x) != NMAGIC \ 70*a9fa9459Szrj && N_MAGIC(x) != ZMAGIC \ 71*a9fa9459Szrj && N_MAGIC(x) != QMAGIC) 72*a9fa9459Szrj # endif /* N_BADMAG */ 73*a9fa9459Szrj #endif 74*a9fa9459Szrj 75*a9fa9459Szrj #endif 76*a9fa9459Szrj 77*a9fa9459Szrj #ifdef QMAGIC 78*a9fa9459Szrj #define N_IS_QMAGIC(x) (N_MAGIC (x) == QMAGIC) 79*a9fa9459Szrj #else 80*a9fa9459Szrj #define N_IS_QMAGIC(x) (0) 81*a9fa9459Szrj #endif 82*a9fa9459Szrj 83*a9fa9459Szrj /* The difference between TARGET_PAGE_SIZE and N_SEGSIZE is that TARGET_PAGE_SIZE is 84*a9fa9459Szrj the finest granularity at which you can page something, thus it 85*a9fa9459Szrj controls the padding (if any) before the text segment of a ZMAGIC 86*a9fa9459Szrj file. N_SEGSIZE is the resolution at which things can be marked as 87*a9fa9459Szrj read-only versus read/write, so it controls the padding between the 88*a9fa9459Szrj text segment and the data segment (in memory; on disk the padding 89*a9fa9459Szrj between them is TARGET_PAGE_SIZE). TARGET_PAGE_SIZE and N_SEGSIZE are the same 90*a9fa9459Szrj for most machines, but different for sun3. */ 91*a9fa9459Szrj 92*a9fa9459Szrj /* By default, segment size is constant. But some machines override this 93*a9fa9459Szrj to be a function of the a.out header (e.g. machine type). */ 94*a9fa9459Szrj 95*a9fa9459Szrj #ifndef N_SEGSIZE 96*a9fa9459Szrj #define N_SEGSIZE(x) SEGMENT_SIZE 97*a9fa9459Szrj #endif 98*a9fa9459Szrj 99*a9fa9459Szrj /* Virtual memory address of the text section. 100*a9fa9459Szrj This is getting very complicated. A good reason to discard a.out format 101*a9fa9459Szrj for something that specifies these fields explicitly. But til then... 102*a9fa9459Szrj 103*a9fa9459Szrj * OMAGIC and NMAGIC files: 104*a9fa9459Szrj (object files: text for "relocatable addr 0" right after the header) 105*a9fa9459Szrj start at 0, offset is EXEC_BYTES_SIZE, size as stated. 106*a9fa9459Szrj * The text address, offset, and size of ZMAGIC files depend 107*a9fa9459Szrj on the entry point of the file: 108*a9fa9459Szrj * entry point below TEXT_START_ADDR: 109*a9fa9459Szrj (hack for SunOS shared libraries) 110*a9fa9459Szrj start at 0, offset is 0, size as stated. 111*a9fa9459Szrj * If N_HEADER_IN_TEXT(x) is true (which defaults to being the 112*a9fa9459Szrj case when the entry point is EXEC_BYTES_SIZE or further into a page): 113*a9fa9459Szrj no padding is needed; text can start after exec header. Sun 114*a9fa9459Szrj considers the text segment of such files to include the exec header; 115*a9fa9459Szrj for BFD's purposes, we don't, which makes more work for us. 116*a9fa9459Szrj start at TEXT_START_ADDR + EXEC_BYTES_SIZE, offset is EXEC_BYTES_SIZE, 117*a9fa9459Szrj size as stated minus EXEC_BYTES_SIZE. 118*a9fa9459Szrj * If N_HEADER_IN_TEXT(x) is false (which defaults to being the case when 119*a9fa9459Szrj the entry point is less than EXEC_BYTES_SIZE into a page (e.g. page 120*a9fa9459Szrj aligned)): (padding is needed so that text can start at a page boundary) 121*a9fa9459Szrj start at TEXT_START_ADDR, offset TARGET_PAGE_SIZE, size as stated. 122*a9fa9459Szrj 123*a9fa9459Szrj Specific configurations may want to hardwire N_HEADER_IN_TEXT, 124*a9fa9459Szrj for efficiency or to allow people to play games with the entry point. 125*a9fa9459Szrj In that case, you would #define N_HEADER_IN_TEXT(x) as 1 for sunos, 126*a9fa9459Szrj and as 0 for most other hosts (Sony News, Vax Ultrix, etc). 127*a9fa9459Szrj (Do this in the appropriate bfd target file.) 128*a9fa9459Szrj (The default is a heuristic that will break if people try changing 129*a9fa9459Szrj the entry point, perhaps with the ld -e flag.) 130*a9fa9459Szrj 131*a9fa9459Szrj * QMAGIC is always like a ZMAGIC for which N_HEADER_IN_TEXT is true, 132*a9fa9459Szrj and for which the starting address is TARGET_PAGE_SIZE (or should this be 133*a9fa9459Szrj SEGMENT_SIZE?) (TEXT_START_ADDR only applies to ZMAGIC, not to QMAGIC). */ 134*a9fa9459Szrj 135*a9fa9459Szrj /* This macro is only relevant for ZMAGIC files; QMAGIC always has the header 136*a9fa9459Szrj in the text. */ 137*a9fa9459Szrj #ifndef N_HEADER_IN_TEXT 138*a9fa9459Szrj #define N_HEADER_IN_TEXT(x) \ 139*a9fa9459Szrj (((x)->a_entry & (TARGET_PAGE_SIZE-1)) >= EXEC_BYTES_SIZE) 140*a9fa9459Szrj #endif 141*a9fa9459Szrj 142*a9fa9459Szrj /* Sun shared libraries, not linux. This macro is only relevant for ZMAGIC 143*a9fa9459Szrj files. */ 144*a9fa9459Szrj #ifndef N_SHARED_LIB 145*a9fa9459Szrj #define N_SHARED_LIB(x) (0) 146*a9fa9459Szrj #endif 147*a9fa9459Szrj 148*a9fa9459Szrj /* Returning 0 not TEXT_START_ADDR for OMAGIC and NMAGIC is based on 149*a9fa9459Szrj the assumption that we are dealing with a .o file, not an 150*a9fa9459Szrj executable. This is necessary for OMAGIC (but means we don't work 151*a9fa9459Szrj right on the output from ld -N); more questionable for NMAGIC. */ 152*a9fa9459Szrj 153*a9fa9459Szrj #ifndef N_TXTADDR 154*a9fa9459Szrj #define N_TXTADDR(x) \ 155*a9fa9459Szrj (/* The address of a QMAGIC file is always one page in, \ 156*a9fa9459Szrj with the header in the text. */ \ 157*a9fa9459Szrj N_IS_QMAGIC (x) \ 158*a9fa9459Szrj ? (bfd_vma) TARGET_PAGE_SIZE + EXEC_BYTES_SIZE \ 159*a9fa9459Szrj : (N_MAGIC (x) != ZMAGIC \ 160*a9fa9459Szrj ? (bfd_vma) 0 /* Object file or NMAGIC. */ \ 161*a9fa9459Szrj : (N_SHARED_LIB (x) \ 162*a9fa9459Szrj ? (bfd_vma) 0 \ 163*a9fa9459Szrj : (N_HEADER_IN_TEXT (x) \ 164*a9fa9459Szrj ? (bfd_vma) TEXT_START_ADDR + EXEC_BYTES_SIZE \ 165*a9fa9459Szrj : (bfd_vma) TEXT_START_ADDR)))) 166*a9fa9459Szrj #endif 167*a9fa9459Szrj 168*a9fa9459Szrj /* If N_HEADER_IN_TEXT is not true for ZMAGIC, there is some padding 169*a9fa9459Szrj to make the text segment start at a certain boundary. For most 170*a9fa9459Szrj systems, this boundary is TARGET_PAGE_SIZE. But for Linux, in the 171*a9fa9459Szrj time-honored tradition of crazy ZMAGIC hacks, it is 1024 which is 172*a9fa9459Szrj not what TARGET_PAGE_SIZE needs to be for QMAGIC. */ 173*a9fa9459Szrj 174*a9fa9459Szrj #ifndef ZMAGIC_DISK_BLOCK_SIZE 175*a9fa9459Szrj #define ZMAGIC_DISK_BLOCK_SIZE TARGET_PAGE_SIZE 176*a9fa9459Szrj #endif 177*a9fa9459Szrj 178*a9fa9459Szrj #define N_DISK_BLOCK_SIZE(x) \ 179*a9fa9459Szrj (N_MAGIC(x) == ZMAGIC ? ZMAGIC_DISK_BLOCK_SIZE : TARGET_PAGE_SIZE) 180*a9fa9459Szrj 181*a9fa9459Szrj /* Offset in an a.out of the start of the text section. */ 182*a9fa9459Szrj #ifndef N_TXTOFF 183*a9fa9459Szrj #define N_TXTOFF(x) \ 184*a9fa9459Szrj (/* For {O,N,Q}MAGIC, no padding. */ \ 185*a9fa9459Szrj N_MAGIC (x) != ZMAGIC \ 186*a9fa9459Szrj ? EXEC_BYTES_SIZE \ 187*a9fa9459Szrj : (N_SHARED_LIB (x) \ 188*a9fa9459Szrj ? 0 \ 189*a9fa9459Szrj : (N_HEADER_IN_TEXT (x) \ 190*a9fa9459Szrj ? EXEC_BYTES_SIZE /* No padding. */ \ 191*a9fa9459Szrj : ZMAGIC_DISK_BLOCK_SIZE /* A page of padding. */))) 192*a9fa9459Szrj #endif 193*a9fa9459Szrj /* Size of the text section. It's always as stated, except that we 194*a9fa9459Szrj offset it to `undo' the adjustment to N_TXTADDR and N_TXTOFF 195*a9fa9459Szrj for ZMAGIC files that nominally include the exec header 196*a9fa9459Szrj as part of the first page of text. (BFD doesn't consider the 197*a9fa9459Szrj exec header to be part of the text segment.) */ 198*a9fa9459Szrj #ifndef N_TXTSIZE 199*a9fa9459Szrj #define N_TXTSIZE(x) \ 200*a9fa9459Szrj (/* For QMAGIC, we don't consider the header part of the text section. */\ 201*a9fa9459Szrj N_IS_QMAGIC (x) \ 202*a9fa9459Szrj ? (x)->a_text - EXEC_BYTES_SIZE \ 203*a9fa9459Szrj : ((N_MAGIC (x) != ZMAGIC || N_SHARED_LIB (x)) \ 204*a9fa9459Szrj ? (x)->a_text \ 205*a9fa9459Szrj : (N_HEADER_IN_TEXT (x) \ 206*a9fa9459Szrj ? (x)->a_text - EXEC_BYTES_SIZE /* No padding. */ \ 207*a9fa9459Szrj : (x)->a_text /* A page of padding. */ ))) 208*a9fa9459Szrj #endif 209*a9fa9459Szrj /* The address of the data segment in virtual memory. 210*a9fa9459Szrj It is the text segment address, plus text segment size, rounded 211*a9fa9459Szrj up to a N_SEGSIZE boundary for pure or pageable files. */ 212*a9fa9459Szrj #ifndef N_DATADDR 213*a9fa9459Szrj #define N_DATADDR(x) \ 214*a9fa9459Szrj (N_MAGIC (x) == OMAGIC \ 215*a9fa9459Szrj ? (N_TXTADDR (x) + N_TXTSIZE (x)) \ 216*a9fa9459Szrj : (N_SEGSIZE (x) + ((N_TXTADDR (x) + N_TXTSIZE (x) - 1) \ 217*a9fa9459Szrj & ~ (bfd_vma) (N_SEGSIZE (x) - 1)))) 218*a9fa9459Szrj #endif 219*a9fa9459Szrj /* The address of the BSS segment -- immediately after the data segment. */ 220*a9fa9459Szrj 221*a9fa9459Szrj #define N_BSSADDR(x) (N_DATADDR (x) + (x)->a_data) 222*a9fa9459Szrj 223*a9fa9459Szrj /* Offsets of the various portions of the file after the text segment. */ 224*a9fa9459Szrj 225*a9fa9459Szrj /* For {Q,Z}MAGIC, there is padding to make the data segment start on 226*a9fa9459Szrj a page boundary. Most of the time the a_text field (and thus 227*a9fa9459Szrj N_TXTSIZE) already contains this padding. It is possible that for 228*a9fa9459Szrj BSDI and/or 386BSD it sometimes doesn't contain the padding, and 229*a9fa9459Szrj perhaps we should be adding it here. But this seems kind of 230*a9fa9459Szrj questionable and probably should be BSDI/386BSD-specific if we do 231*a9fa9459Szrj do it. 232*a9fa9459Szrj 233*a9fa9459Szrj For NMAGIC (at least for hp300 BSD, probably others), there is 234*a9fa9459Szrj padding in memory only, not on disk, so we must *not* ever pad here 235*a9fa9459Szrj for NMAGIC. */ 236*a9fa9459Szrj 237*a9fa9459Szrj #ifndef N_DATOFF 238*a9fa9459Szrj #define N_DATOFF(x) (N_TXTOFF (x) + N_TXTSIZE (x)) 239*a9fa9459Szrj #endif 240*a9fa9459Szrj #ifndef N_TRELOFF 241*a9fa9459Szrj #define N_TRELOFF(x) (N_DATOFF (x) + (x)->a_data) 242*a9fa9459Szrj #endif 243*a9fa9459Szrj #ifndef N_DRELOFF 244*a9fa9459Szrj #define N_DRELOFF(x) (N_TRELOFF (x) + (x)->a_trsize) 245*a9fa9459Szrj #endif 246*a9fa9459Szrj #ifndef N_SYMOFF 247*a9fa9459Szrj #define N_SYMOFF(x) (N_DRELOFF (x) + (x)->a_drsize) 248*a9fa9459Szrj #endif 249*a9fa9459Szrj #ifndef N_STROFF 250*a9fa9459Szrj #define N_STROFF(x) (N_SYMOFF (x) + (x)->a_syms) 251*a9fa9459Szrj #endif 252*a9fa9459Szrj 253*a9fa9459Szrj /* Symbols */ 254*a9fa9459Szrj #ifndef external_nlist 255*a9fa9459Szrj struct external_nlist 256*a9fa9459Szrj { 257*a9fa9459Szrj bfd_byte e_strx[BYTES_IN_WORD]; /* Index into string table of name. */ 258*a9fa9459Szrj bfd_byte e_type[1]; /* Type of symbol. */ 259*a9fa9459Szrj bfd_byte e_other[1]; /* Misc info (usually empty). */ 260*a9fa9459Szrj bfd_byte e_desc[2]; /* Description field. */ 261*a9fa9459Szrj bfd_byte e_value[BYTES_IN_WORD]; /* Value of symbol. */ 262*a9fa9459Szrj }; 263*a9fa9459Szrj #define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) 264*a9fa9459Szrj #endif 265*a9fa9459Szrj 266*a9fa9459Szrj struct internal_nlist 267*a9fa9459Szrj { 268*a9fa9459Szrj unsigned long n_strx; /* Index into string table of name. */ 269*a9fa9459Szrj unsigned char n_type; /* Type of symbol. */ 270*a9fa9459Szrj unsigned char n_other; /* Misc info (usually empty). */ 271*a9fa9459Szrj unsigned short n_desc; /* Description field. */ 272*a9fa9459Szrj bfd_vma n_value; /* Value of symbol. */ 273*a9fa9459Szrj }; 274*a9fa9459Szrj 275*a9fa9459Szrj /* The n_type field is the symbol type, containing: */ 276*a9fa9459Szrj 277*a9fa9459Szrj #define N_UNDF 0 /* Undefined symbol. */ 278*a9fa9459Szrj #define N_ABS 2 /* Absolute symbol -- defined at particular addr. */ 279*a9fa9459Szrj #define N_TEXT 4 /* Text sym -- defined at offset in text seg. */ 280*a9fa9459Szrj #define N_DATA 6 /* Data sym -- defined at offset in data seg. */ 281*a9fa9459Szrj #define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg. */ 282*a9fa9459Szrj #define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink). */ 283*a9fa9459Szrj #define N_FN 0x1f /* File name of .o file. */ 284*a9fa9459Szrj #define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh). */ 285*a9fa9459Szrj /* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, 286*a9fa9459Szrj N_DATA, or N_BSS. When the low-order bit of other types is set, 287*a9fa9459Szrj (e.g. N_WARNING versus N_FN), they are two different types. */ 288*a9fa9459Szrj #define N_EXT 1 /* External symbol (as opposed to local-to-this-file). */ 289*a9fa9459Szrj #define N_TYPE 0x1e 290*a9fa9459Szrj #define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol. */ 291*a9fa9459Szrj 292*a9fa9459Szrj #define N_INDR 0x0a 293*a9fa9459Szrj 294*a9fa9459Szrj /* The following symbols refer to set elements. 295*a9fa9459Szrj All the N_SET[ATDB] symbols with the same name form one set. 296*a9fa9459Szrj Space is allocated for the set in the text section, and each set 297*a9fa9459Szrj elements value is stored into one word of the space. 298*a9fa9459Szrj The first word of the space is the length of the set (number of elements). 299*a9fa9459Szrj 300*a9fa9459Szrj The address of the set is made into an N_SETV symbol 301*a9fa9459Szrj whose name is the same as the name of the set. 302*a9fa9459Szrj This symbol acts like a N_DATA global symbol 303*a9fa9459Szrj in that it can satisfy undefined external references. */ 304*a9fa9459Szrj 305*a9fa9459Szrj /* These appear as input to LD, in a .o file. */ 306*a9fa9459Szrj #define N_SETA 0x14 /* Absolute set element symbol. */ 307*a9fa9459Szrj #define N_SETT 0x16 /* Text set element symbol. */ 308*a9fa9459Szrj #define N_SETD 0x18 /* Data set element symbol. */ 309*a9fa9459Szrj #define N_SETB 0x1A /* Bss set element symbol. */ 310*a9fa9459Szrj 311*a9fa9459Szrj /* This is output from LD. */ 312*a9fa9459Szrj #define N_SETV 0x1C /* Pointer to set vector in data area. */ 313*a9fa9459Szrj 314*a9fa9459Szrj /* Warning symbol. The text gives a warning message, the next symbol 315*a9fa9459Szrj in the table will be undefined. When the symbol is referenced, the 316*a9fa9459Szrj message is printed. */ 317*a9fa9459Szrj 318*a9fa9459Szrj #define N_WARNING 0x1e 319*a9fa9459Szrj 320*a9fa9459Szrj /* Weak symbols. These are a GNU extension to the a.out format. The 321*a9fa9459Szrj semantics are those of ELF weak symbols. Weak symbols are always 322*a9fa9459Szrj externally visible. The N_WEAK? values are squeezed into the 323*a9fa9459Szrj available slots. The value of a N_WEAKU symbol is 0. The values 324*a9fa9459Szrj of the other types are the definitions. */ 325*a9fa9459Szrj #define N_WEAKU 0x0d /* Weak undefined symbol. */ 326*a9fa9459Szrj #define N_WEAKA 0x0e /* Weak absolute symbol. */ 327*a9fa9459Szrj #define N_WEAKT 0x0f /* Weak text symbol. */ 328*a9fa9459Szrj #define N_WEAKD 0x10 /* Weak data symbol. */ 329*a9fa9459Szrj #define N_WEAKB 0x11 /* Weak bss symbol. */ 330*a9fa9459Szrj 331*a9fa9459Szrj /* Relocations 332*a9fa9459Szrj 333*a9fa9459Szrj There are two types of relocation flavours for a.out systems, 334*a9fa9459Szrj standard and extended. The standard form is used on systems where the 335*a9fa9459Szrj instruction has room for all the bits of an offset to the operand, whilst 336*a9fa9459Szrj the extended form is used when an address operand has to be split over n 337*a9fa9459Szrj instructions. Eg, on the 68k, each move instruction can reference 338*a9fa9459Szrj the target with a displacement of 16 or 32 bits. On the sparc, move 339*a9fa9459Szrj instructions use an offset of 14 bits, so the offset is stored in 340*a9fa9459Szrj the reloc field, and the data in the section is ignored. */ 341*a9fa9459Szrj 342*a9fa9459Szrj /* This structure describes a single relocation to be performed. 343*a9fa9459Szrj The text-relocation section of the file is a vector of these structures, 344*a9fa9459Szrj all of which apply to the text section. 345*a9fa9459Szrj Likewise, the data-relocation section applies to the data section. */ 346*a9fa9459Szrj 347*a9fa9459Szrj struct reloc_std_external 348*a9fa9459Szrj { 349*a9fa9459Szrj bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ 350*a9fa9459Szrj bfd_byte r_index[3]; /* Symbol table index of symbol. */ 351*a9fa9459Szrj bfd_byte r_type[1]; /* Relocation type. */ 352*a9fa9459Szrj }; 353*a9fa9459Szrj 354*a9fa9459Szrj #define RELOC_STD_BITS_PCREL_BIG ((unsigned int) 0x80) 355*a9fa9459Szrj #define RELOC_STD_BITS_PCREL_LITTLE ((unsigned int) 0x01) 356*a9fa9459Szrj 357*a9fa9459Szrj #define RELOC_STD_BITS_LENGTH_BIG ((unsigned int) 0x60) 358*a9fa9459Szrj #define RELOC_STD_BITS_LENGTH_SH_BIG 5 359*a9fa9459Szrj #define RELOC_STD_BITS_LENGTH_LITTLE ((unsigned int) 0x06) 360*a9fa9459Szrj #define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 361*a9fa9459Szrj 362*a9fa9459Szrj #define RELOC_STD_BITS_EXTERN_BIG ((unsigned int) 0x10) 363*a9fa9459Szrj #define RELOC_STD_BITS_EXTERN_LITTLE ((unsigned int) 0x08) 364*a9fa9459Szrj 365*a9fa9459Szrj #define RELOC_STD_BITS_BASEREL_BIG ((unsigned int) 0x08) 366*a9fa9459Szrj #define RELOC_STD_BITS_BASEREL_LITTLE ((unsigned int) 0x10) 367*a9fa9459Szrj 368*a9fa9459Szrj #define RELOC_STD_BITS_JMPTABLE_BIG ((unsigned int) 0x04) 369*a9fa9459Szrj #define RELOC_STD_BITS_JMPTABLE_LITTLE ((unsigned int) 0x20) 370*a9fa9459Szrj 371*a9fa9459Szrj #define RELOC_STD_BITS_RELATIVE_BIG ((unsigned int) 0x02) 372*a9fa9459Szrj #define RELOC_STD_BITS_RELATIVE_LITTLE ((unsigned int) 0x40) 373*a9fa9459Szrj 374*a9fa9459Szrj #define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry. */ 375*a9fa9459Szrj 376*a9fa9459Szrj struct reloc_std_internal 377*a9fa9459Szrj { 378*a9fa9459Szrj bfd_vma r_address; /* Address (within segment) to be relocated. */ 379*a9fa9459Szrj /* The meaning of r_symbolnum depends on r_extern. */ 380*a9fa9459Szrj unsigned int r_symbolnum:24; 381*a9fa9459Szrj /* Nonzero means value is a pc-relative offset 382*a9fa9459Szrj and it should be relocated for changes in its own address 383*a9fa9459Szrj as well as for changes in the symbol or section specified. */ 384*a9fa9459Szrj unsigned int r_pcrel:1; 385*a9fa9459Szrj /* Length (as exponent of 2) of the field to be relocated. 386*a9fa9459Szrj Thus, a value of 2 indicates 1<<2 bytes. */ 387*a9fa9459Szrj unsigned int r_length:2; 388*a9fa9459Szrj /* 1 => relocate with value of symbol. 389*a9fa9459Szrj r_symbolnum is the index of the symbol 390*a9fa9459Szrj in files the symbol table. 391*a9fa9459Szrj 0 => relocate with the address of a segment. 392*a9fa9459Szrj r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS 393*a9fa9459Szrj (the N_EXT bit may be set also, but signifies nothing). */ 394*a9fa9459Szrj unsigned int r_extern:1; 395*a9fa9459Szrj /* The next three bits are for SunOS shared libraries, and seem to 396*a9fa9459Szrj be undocumented. */ 397*a9fa9459Szrj unsigned int r_baserel:1; /* Linkage table relative. */ 398*a9fa9459Szrj unsigned int r_jmptable:1; /* pc-relative to jump table. */ 399*a9fa9459Szrj unsigned int r_relative:1; /* "relative relocation". */ 400*a9fa9459Szrj /* unused */ 401*a9fa9459Szrj unsigned int r_pad:1; /* Padding -- set to zero. */ 402*a9fa9459Szrj }; 403*a9fa9459Szrj 404*a9fa9459Szrj 405*a9fa9459Szrj /* EXTENDED RELOCS. */ 406*a9fa9459Szrj 407*a9fa9459Szrj struct reloc_ext_external 408*a9fa9459Szrj { 409*a9fa9459Szrj bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ 410*a9fa9459Szrj bfd_byte r_index[3]; /* Symbol table index of symbol. */ 411*a9fa9459Szrj bfd_byte r_type[1]; /* Relocation type. */ 412*a9fa9459Szrj bfd_byte r_addend[BYTES_IN_WORD]; /* Datum addend. */ 413*a9fa9459Szrj }; 414*a9fa9459Szrj 415*a9fa9459Szrj #ifndef RELOC_EXT_BITS_EXTERN_BIG 416*a9fa9459Szrj #define RELOC_EXT_BITS_EXTERN_BIG ((unsigned int) 0x80) 417*a9fa9459Szrj #endif 418*a9fa9459Szrj 419*a9fa9459Szrj #ifndef RELOC_EXT_BITS_EXTERN_LITTLE 420*a9fa9459Szrj #define RELOC_EXT_BITS_EXTERN_LITTLE ((unsigned int) 0x01) 421*a9fa9459Szrj #endif 422*a9fa9459Szrj 423*a9fa9459Szrj #ifndef RELOC_EXT_BITS_TYPE_BIG 424*a9fa9459Szrj #define RELOC_EXT_BITS_TYPE_BIG ((unsigned int) 0x1F) 425*a9fa9459Szrj #endif 426*a9fa9459Szrj 427*a9fa9459Szrj #ifndef RELOC_EXT_BITS_TYPE_SH_BIG 428*a9fa9459Szrj #define RELOC_EXT_BITS_TYPE_SH_BIG 0 429*a9fa9459Szrj #endif 430*a9fa9459Szrj 431*a9fa9459Szrj #ifndef RELOC_EXT_BITS_TYPE_LITTLE 432*a9fa9459Szrj #define RELOC_EXT_BITS_TYPE_LITTLE ((unsigned int) 0xF8) 433*a9fa9459Szrj #endif 434*a9fa9459Szrj 435*a9fa9459Szrj #ifndef RELOC_EXT_BITS_TYPE_SH_LITTLE 436*a9fa9459Szrj #define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 437*a9fa9459Szrj #endif 438*a9fa9459Szrj 439*a9fa9459Szrj /* Bytes per relocation entry. */ 440*a9fa9459Szrj #define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) 441*a9fa9459Szrj 442*a9fa9459Szrj enum reloc_type 443*a9fa9459Szrj { 444*a9fa9459Szrj /* Simple relocations. */ 445*a9fa9459Szrj RELOC_8, /* data[0:7] = addend + sv */ 446*a9fa9459Szrj RELOC_16, /* data[0:15] = addend + sv */ 447*a9fa9459Szrj RELOC_32, /* data[0:31] = addend + sv */ 448*a9fa9459Szrj /* PC-rel displacement. */ 449*a9fa9459Szrj RELOC_DISP8, /* data[0:7] = addend - pc + sv */ 450*a9fa9459Szrj RELOC_DISP16, /* data[0:15] = addend - pc + sv */ 451*a9fa9459Szrj RELOC_DISP32, /* data[0:31] = addend - pc + sv */ 452*a9fa9459Szrj /* Special. */ 453*a9fa9459Szrj RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ 454*a9fa9459Szrj RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ 455*a9fa9459Szrj RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ 456*a9fa9459Szrj RELOC_22, /* data[0:21] = (addend + sv) */ 457*a9fa9459Szrj RELOC_13, /* data[0:12] = (addend + sv) */ 458*a9fa9459Szrj RELOC_LO10, /* data[0:9] = (addend + sv) */ 459*a9fa9459Szrj RELOC_SFA_BASE, 460*a9fa9459Szrj RELOC_SFA_OFF13, 461*a9fa9459Szrj /* P.I.C. (base-relative). */ 462*a9fa9459Szrj RELOC_BASE10, /* Not sure - maybe we can do this the */ 463*a9fa9459Szrj RELOC_BASE13, /* right way now */ 464*a9fa9459Szrj RELOC_BASE22, 465*a9fa9459Szrj /* For some sort of pc-rel P.I.C. (?) */ 466*a9fa9459Szrj RELOC_PC10, 467*a9fa9459Szrj RELOC_PC22, 468*a9fa9459Szrj /* P.I.C. jump table. */ 469*a9fa9459Szrj RELOC_JMP_TBL, 470*a9fa9459Szrj /* Reputedly for shared libraries somehow. */ 471*a9fa9459Szrj RELOC_SEGOFF16, 472*a9fa9459Szrj RELOC_GLOB_DAT, 473*a9fa9459Szrj RELOC_JMP_SLOT, 474*a9fa9459Szrj RELOC_RELATIVE, 475*a9fa9459Szrj 476*a9fa9459Szrj RELOC_11, 477*a9fa9459Szrj RELOC_WDISP2_14, 478*a9fa9459Szrj RELOC_WDISP19, 479*a9fa9459Szrj RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ 480*a9fa9459Szrj RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ 481*a9fa9459Szrj 482*a9fa9459Szrj /* 29K relocation types. */ 483*a9fa9459Szrj RELOC_JUMPTARG, 484*a9fa9459Szrj RELOC_CONST, 485*a9fa9459Szrj RELOC_CONSTH, 486*a9fa9459Szrj 487*a9fa9459Szrj /* All the new ones I can think of, for sparc v9. */ 488*a9fa9459Szrj RELOC_64, /* data[0:63] = addend + sv */ 489*a9fa9459Szrj RELOC_DISP64, /* data[0:63] = addend - pc + sv */ 490*a9fa9459Szrj RELOC_WDISP21, /* data[0:20] = (addend + sv - pc)>>2 */ 491*a9fa9459Szrj RELOC_DISP21, /* data[0:20] = addend - pc + sv */ 492*a9fa9459Szrj RELOC_DISP14, /* data[0:13] = addend - pc + sv */ 493*a9fa9459Szrj /* Q . 494*a9fa9459Szrj What are the other ones, 495*a9fa9459Szrj Since this is a clean slate, can we throw away the ones we dont 496*a9fa9459Szrj understand ? Should we sort the values ? What about using a 497*a9fa9459Szrj microcode format like the 68k ? */ 498*a9fa9459Szrj NO_RELOC 499*a9fa9459Szrj }; 500*a9fa9459Szrj 501*a9fa9459Szrj 502*a9fa9459Szrj struct reloc_internal 503*a9fa9459Szrj { 504*a9fa9459Szrj bfd_vma r_address; /* Offset of of data to relocate. */ 505*a9fa9459Szrj long r_index; /* Symbol table index of symbol. */ 506*a9fa9459Szrj enum reloc_type r_type; /* Relocation type. */ 507*a9fa9459Szrj bfd_vma r_addend; /* Datum addend. */ 508*a9fa9459Szrj }; 509*a9fa9459Szrj 510*a9fa9459Szrj /* Q. 511*a9fa9459Szrj Should the length of the string table be 4 bytes or 8 bytes ? 512*a9fa9459Szrj 513*a9fa9459Szrj Q. 514*a9fa9459Szrj What about archive indexes ? */ 515*a9fa9459Szrj 516*a9fa9459Szrj #endif /* __A_OUT_64_H__ */ 517