00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #define __STDC_LIMIT_MACROS
00040 #include <stdint.h>
00041 #include "elf_stuff.h"
00042 #include "defs.h"
00043 #include "sections.h"
00044
00045 #ifdef SHF_IA_64_SHORT
00046 #undef SHF_IA_64_SHORT
00047 #define SHF_IA_64_SHORT SHF_MIPS_GPREL
00048 #endif
00049 #define INST_BYTES 16
00050
00051 SECTION Sections[_SEC_INDEX_MAX] = {
00052 {_SEC_UNKNOWN,NULL,
00053 0,
00054 0, 0,
00055 0, ".unknown", 0},
00056 {_SEC_TEXT, NULL,
00057 0|SHF_EXECINSTR|SHF_ALLOC,
00058 SHT_PROGBITS, INST_BYTES,
00059 INT64_MAX, ELF_TEXT, 0},
00060 {_SEC_DATA, NULL,
00061 0|SHF_WRITE|SHF_ALLOC,
00062 SHT_PROGBITS, 0,
00063 INT64_MAX, ELF_DATA, 0},
00064 #ifdef KEY
00065 { _SEC_LDATA_MIPS_LOCAL, NULL,
00066 0,
00067 0, 0,
00068 0, ".unknown", 0},
00069 #endif
00070 {_SEC_SDATA, NULL,
00071 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00072 SHT_PROGBITS, 0,
00073 INT32_MAX, MIPS_SDATA, 0},
00074 {_SEC_LDATA, NULL,
00075 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_LOCAL,
00076 SHT_PROGBITS, 0,
00077 INT64_MAX, ".MIPS.ldata", 0},
00078 {_SEC_RDATA, NULL,
00079 0|SHF_ALLOC,
00080 SHT_PROGBITS, 0,
00081
00082
00083 INT64_MAX, MIPS_RDATA, 0},
00084 {_SEC_SRDATA, NULL,
00085 0|SHF_MIPS_GPREL|SHF_ALLOC,
00086 SHT_PROGBITS, 0,
00087 INT32_MAX, MIPS_SRDATA, 0},
00088 {_SEC_LIT4, NULL,
00089 0|SHF_IA_64_SHORT|SHF_ALLOC|SHF_MIPS_MERGE,
00090 SHT_PROGBITS, 4,
00091 INT32_MAX, MIPS_LIT4, 0},
00092 {_SEC_LIT8, NULL,
00093 0|SHF_IA_64_SHORT|SHF_ALLOC|SHF_MIPS_MERGE,
00094 SHT_PROGBITS, 8,
00095 INT32_MAX, MIPS_LIT8, 0},
00096 {_SEC_LIT16, NULL,
00097 0|SHF_IA_64_SHORT|SHF_ALLOC|SHF_MIPS_MERGE,
00098 SHT_PROGBITS, 16,
00099 INT32_MAX, MIPS_LIT16, 0},
00100 {_SEC_BSS, NULL,
00101 0|SHF_WRITE|SHF_ALLOC,
00102 SHT_NOBITS, 0,
00103 INT64_MAX, ELF_BSS, 0},
00104 {_SEC_SBSS, NULL,
00105 0|SHF_WRITE|SHF_IA_64_SHORT|SHF_ALLOC,
00106 SHT_NOBITS, 0,
00107 INT32_MAX, MIPS_SBSS, 0},
00108 #ifndef linux
00109 {_SEC_LBSS, NULL,
00110 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_LOCAL,
00111 SHT_NOBITS, 0,
00112 INT64_MAX, MIPS_LBSS, 0},
00113 #else
00114
00115 {_SEC_LBSS, NULL,
00116 0,
00117 0, 0,
00118 0, ".unknown", 0},
00119 #endif
00120 {_SEC_GOT, NULL,
00121 0|SHF_IA_64_SHORT|SHF_ALLOC,
00122 SHT_PROGBITS, 0,
00123 INT32_MAX, ELF_GOT, 0},
00124 {_SEC_CPLINIT, NULL,
00125 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00126 SHT_PROGBITS, 0,
00127 INT64_MAX, "__cplinit", 0},
00128 #ifndef linux
00129 {_SEC_EH_REGION, NULL,
00130 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00131 SHT_PROGBITS, 0,
00132 INT64_MAX, MIPS_EH_REGION, 0},
00133 {_SEC_EH_REGION_SUPP, NULL,
00134 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00135 SHT_PROGBITS, 0,
00136 INT64_MAX, MIPS_EH_REGION_SUPP, 0},
00137 #else
00138 #ifdef KEY
00139 {_SEC_EH_REGION, NULL,
00140 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00141 SHT_PROGBITS, 0,
00142 INT64_MAX, ".except_table", 0},
00143 {_SEC_EH_REGION_SUPP, NULL,
00144 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00145 SHT_PROGBITS, 0,
00146 INT64_MAX, ".except_table_supp", 0},
00147 #else
00148
00149 {_SEC_EH_REGION, NULL,
00150 0,
00151 0, 0,
00152 0, ".unknown", 0},
00153 {_SEC_EH_REGION_SUPP, NULL,
00154 0,
00155 0, 0,
00156 0, ".unknown", 0},
00157 #endif
00158 #endif
00159 {_SEC_DISTR_ARRAY, NULL,
00160 0|SHF_WRITE|SHF_ALLOC|SHF_MIPS_NAMES,
00161 SHT_PROGBITS, 0,
00162 INT64_MAX, "_MIPS_distr_array", 0},
00163 #ifdef TARG_SL
00164 {_SEC_SSDATA, NULL,
00165 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00166 SHT_PROGBITS, 0,
00167 INT32_MAX, MIPS_SSDATA, 0},
00168
00169 {_SEC_VSDATA, NULL,
00170 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00171 SHT_PROGBITS, 0,
00172 INT32_MAX, MIPS_VSDATA, 0},
00173
00174
00175 {_SEC_VS1DATA, NULL,
00176 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00177 SHT_PROGBITS, 0,
00178 INT32_MAX, MIPS_VS1DATA, 0},
00179
00180 {_SEC_VS2DATA, NULL,
00181 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00182 SHT_PROGBITS, 0,
00183 INT32_MAX, MIPS_VS2DATA, 0},
00184
00185 {_SEC_VS4DATA, NULL,
00186 0|SHF_WRITE|SHF_MIPS_GPREL|SHF_ALLOC,
00187 SHT_PROGBITS, 0,
00188 INT32_MAX, MIPS_VS4DATA, 0},
00189 #endif
00190 };
00191
00192 extern SECTION_IDX
00193 Corresponding_Short_Section (SECTION_IDX sec)
00194 {
00195 switch ( sec ) {
00196 case _SEC_DATA: return _SEC_SDATA;
00197 case _SEC_RDATA: return _SEC_RDATA;
00198 case _SEC_BSS: return _SEC_SBSS;
00199 default: return sec;
00200 }
00201 }
00202
00203 extern BOOL
00204 SEC_is_gprel (SECTION_IDX sec)
00205 {
00206 return (SEC_flags(sec) & SHF_IA_64_SHORT);
00207 }
00208
00209 extern BOOL
00210 SEC_is_merge (SECTION_IDX sec)
00211 {
00212 return (SEC_flags(sec) & SHF_MIPS_MERGE);
00213 }
00214
00215 extern BOOL
00216 SEC_is_exec (SECTION_IDX sec)
00217 {
00218 return (SEC_flags(sec) & SHF_EXECINSTR);
00219 }
00220
00221 extern BOOL
00222 SEC_is_nobits (SECTION_IDX sec)
00223 {
00224 return (SEC_type(sec) & SHT_NOBITS);
00225 }
00226
00227 extern BOOL
00228 SEC_is_tls (SECTION_IDX sec)
00229 {
00230 INT t = (SEC_flags(sec) & SHF_TLS);
00231 Is_True(t == 0, ("SL cannot has TLS sections"));
00232 return FALSE;
00233 }