1 /* ----------------------------------------------------------------------- * 2 * 3 * Copyright 1996-2019 The NASM Authors - All Rights Reserved 4 * See the file AUTHORS included with the NASM distribution for 5 * the specific copyright holders. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following 9 * conditions are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * 32 * ----------------------------------------------------------------------- */ 33 34 /* 35 * Internal definitions common to outelf32 and outelf64 36 */ 37 #ifndef OUTPUT_OUTELF_H 38 #define OUTPUT_OUTELF_H 39 40 #include "elf.h" 41 #include "rbtree.h" 42 #include "saa.h" 43 44 #define GLOBAL_TEMP_BASE 0x40000000 /* bigger than any sane symbol index */ 45 46 /* alignment of sections in file */ 47 #define SEC_FILEALIGN 16 48 49 /* this stuff is needed for the dwarf/stabs debugging format */ 50 #define TY_DEBUGSYMLIN 0x40 /* internal call to debug_out */ 51 52 /* 53 * Debugging ELF sections (section indicies starting with sec_debug) 54 */ 55 56 /* stabs */ 57 #define sec_stab (sec_debug + 0) 58 #define sec_stabstr (sec_debug + 1) 59 #define sec_rel_stab (sec_debug + 2) 60 61 /* stabs symbol table format */ 62 struct stabentry { 63 uint32_t n_strx; 64 uint8_t n_type; 65 uint8_t n_other; 66 uint16_t n_desc; 67 uint32_t n_value; 68 }; 69 70 /* dwarf */ 71 #define sec_debug_aranges (sec_debug + 0) 72 #define sec_rela_debug_aranges (sec_debug + 1) 73 #define sec_debug_pubnames (sec_debug + 2) 74 #define sec_debug_info (sec_debug + 3) 75 #define sec_rela_debug_info (sec_debug + 4) 76 #define sec_debug_abbrev (sec_debug + 5) 77 #define sec_debug_line (sec_debug + 6) 78 #define sec_rela_debug_line (sec_debug + 7) 79 #define sec_debug_frame (sec_debug + 8) 80 #define sec_debug_loc (sec_debug + 9) 81 82 extern uint8_t elf_osabi; 83 extern uint8_t elf_abiver; 84 85 #define WRITE_STAB(p,n_strx,n_type,n_other,n_desc,n_value) \ 86 do { \ 87 WRITELONG(p, n_strx); \ 88 WRITECHAR(p, n_type); \ 89 WRITECHAR(p, n_other); \ 90 WRITESHORT(p, n_desc); \ 91 WRITELONG(p, n_value); \ 92 } while (0) 93 94 struct elf_reloc { 95 struct elf_reloc *next; 96 int64_t address; /* relative to _start_ of section */ 97 int64_t symbol; /* symbol index */ 98 int64_t offset; /* symbol addend */ 99 int type; /* type of relocation */ 100 }; 101 102 struct elf_symbol { 103 struct rbtree symv; /* symbol value and symbol rbtree */ 104 int32_t strpos; /* string table position of name */ 105 int32_t section; /* section ID of the symbol */ 106 int type; /* symbol type */ 107 int other; /* symbol visibility */ 108 int32_t size; /* size of symbol */ 109 int32_t globnum; /* symbol table offset if global */ 110 struct elf_symbol *nextfwd; /* list of unresolved-size symbols */ 111 char *name; /* used temporarily if in above list */ 112 }; 113 114 struct elf_section { 115 struct SAA *data; 116 uint64_t len; 117 uint64_t size; 118 uint64_t nrelocs; 119 int32_t index; /* NASM index or NO_SEG if internal */ 120 int shndx; /* ELF index */ 121 int type; /* SHT_* */ 122 uint64_t align; /* alignment: power of two */ 123 uint64_t flags; /* section flags */ 124 int64_t pass_last_seen; 125 uint64_t entsize; /* entry size */ 126 char *name; 127 struct SAA *rel; 128 struct elf_reloc *head; 129 struct elf_reloc **tail; 130 struct rbtree *gsyms; /* global symbols in section */ 131 }; 132 133 #endif /* OUTPUT_OUTELF_H */ 134