diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2005-10-02 07:50:49 +0000 |
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2005-10-02 07:50:49 +0000 |
| commit | cb1ce7b9748974aab2f6246ecb9bfb8388a1009b (patch) | |
| tree | f0ad90a45be921479cbd3663f487a365888afae2 /modutils | |
| parent | fa17c4b94951374c919c6a099db9dcfcc2487c19 (diff) | |
| download | busybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.tar.gz busybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.tar.bz2 busybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.zip | |
reorder arches into alphabetical order
Diffstat (limited to 'modutils')
| -rw-r--r-- | modutils/insmod.c | 399 |
1 files changed, 201 insertions, 198 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c index d35e08d4e..e6432ef16 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c | |||
| @@ -143,6 +143,16 @@ extern int insmod_ng_main( int argc, char **argv); | |||
| 143 | #endif | 143 | #endif |
| 144 | #endif | 144 | #endif |
| 145 | 145 | ||
| 146 | /* H8/300 */ | ||
| 147 | #if defined(__H8300H__) || defined(__H8300S__) | ||
| 148 | #define MATCH_MACHINE(x) (x == EM_H8_300) | ||
| 149 | #define SHT_RELM SHT_RELA | ||
| 150 | #define Elf32_RelM Elf32_Rela | ||
| 151 | #define ELFCLASSM ELFCLASS32 | ||
| 152 | #define CONFIG_USE_SINGLE | ||
| 153 | #define SYMBOL_PREFIX "_" | ||
| 154 | #endif | ||
| 155 | |||
| 146 | /* PA-RISC / HP-PA */ | 156 | /* PA-RISC / HP-PA */ |
| 147 | #if defined(__hppa__) | 157 | #if defined(__hppa__) |
| 148 | #define MATCH_MACHINE(x) (x == EM_PARISC) | 158 | #define MATCH_MACHINE(x) (x == EM_PARISC) |
| @@ -156,16 +166,6 @@ extern int insmod_ng_main( int argc, char **argv); | |||
| 156 | #endif | 166 | #endif |
| 157 | #endif | 167 | #endif |
| 158 | 168 | ||
| 159 | /* H8/300 */ | ||
| 160 | #if defined(__H8300H__) || defined(__H8300S__) | ||
| 161 | #define MATCH_MACHINE(x) (x == EM_H8_300) | ||
| 162 | #define SHT_RELM SHT_RELA | ||
| 163 | #define Elf32_RelM Elf32_Rela | ||
| 164 | #define ELFCLASSM ELFCLASS32 | ||
| 165 | #define CONFIG_USE_SINGLE | ||
| 166 | #define SYMBOL_PREFIX "_" | ||
| 167 | #endif | ||
| 168 | |||
| 169 | /* x86 */ | 169 | /* x86 */ |
| 170 | #if defined(__i386__) | 170 | #if defined(__i386__) |
| 171 | #ifndef EM_486 | 171 | #ifndef EM_486 |
| @@ -858,16 +858,17 @@ arch_apply_relocation(struct obj_file *f, | |||
| 858 | #if defined(CONFIG_USE_PLT_ENTRIES) | 858 | #if defined(CONFIG_USE_PLT_ENTRIES) |
| 859 | ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0; | 859 | ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0; |
| 860 | unsigned long *ip; | 860 | unsigned long *ip; |
| 861 | #if defined(CONFIG_USE_PLT_LIST) | 861 | # if defined(CONFIG_USE_PLT_LIST) |
| 862 | struct arch_list_entry *pe; | 862 | struct arch_list_entry *pe; |
| 863 | #else | 863 | # else |
| 864 | struct arch_single_entry *pe; | 864 | struct arch_single_entry *pe; |
| 865 | #endif | 865 | # endif |
| 866 | #endif | 866 | #endif |
| 867 | 867 | ||
| 868 | switch (ELF_R_TYPE(rel->r_info)) { | 868 | switch (ELF_R_TYPE(rel->r_info)) { |
| 869 | 869 | ||
| 870 | #if defined(__arm__) | 870 | #if defined(__arm__) |
| 871 | |||
| 871 | case R_ARM_NONE: | 872 | case R_ARM_NONE: |
| 872 | break; | 873 | break; |
| 873 | 874 | ||
| @@ -896,90 +897,46 @@ arch_apply_relocation(struct obj_file *f, | |||
| 896 | *loc += v - got; | 897 | *loc += v - got; |
| 897 | break; | 898 | break; |
| 898 | 899 | ||
| 899 | #elif defined(__s390__) | 900 | #elif defined(__cris__) |
| 900 | case R_390_32: | ||
| 901 | *(unsigned int *) loc += v; | ||
| 902 | break; | ||
| 903 | case R_390_16: | ||
| 904 | *(unsigned short *) loc += v; | ||
| 905 | break; | ||
| 906 | case R_390_8: | ||
| 907 | *(unsigned char *) loc += v; | ||
| 908 | break; | ||
| 909 | |||
| 910 | case R_390_PC32: | ||
| 911 | *(unsigned int *) loc += v - dot; | ||
| 912 | break; | ||
| 913 | case R_390_PC16DBL: | ||
| 914 | *(unsigned short *) loc += (v - dot) >> 1; | ||
| 915 | break; | ||
| 916 | case R_390_PC16: | ||
| 917 | *(unsigned short *) loc += v - dot; | ||
| 918 | break; | ||
| 919 | |||
| 920 | case R_390_PLT32: | ||
| 921 | case R_390_PLT16DBL: | ||
| 922 | /* find the plt entry and initialize it. */ | ||
| 923 | assert(isym != NULL); | ||
| 924 | pe = (struct arch_single_entry *) &isym->pltent; | ||
| 925 | assert(pe->allocated); | ||
| 926 | if (pe->inited == 0) { | ||
| 927 | ip = (unsigned long *)(ifile->plt->contents + pe->offset); | ||
| 928 | ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */ | ||
| 929 | ip[1] = 0x100607f1; | ||
| 930 | if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL) | ||
| 931 | ip[2] = v - 2; | ||
| 932 | else | ||
| 933 | ip[2] = v; | ||
| 934 | pe->inited = 1; | ||
| 935 | } | ||
| 936 | 901 | ||
| 937 | /* Insert relative distance to target. */ | 902 | case R_CRIS_NONE: |
| 938 | v = plt + pe->offset - dot; | ||
| 939 | if (ELF_R_TYPE(rel->r_info) == R_390_PLT32) | ||
| 940 | *(unsigned int *) loc = (unsigned int) v; | ||
| 941 | else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL) | ||
| 942 | *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1); | ||
| 943 | break; | 903 | break; |
| 944 | 904 | ||
| 945 | case R_390_GLOB_DAT: | 905 | case R_CRIS_32: |
| 946 | case R_390_JMP_SLOT: | 906 | /* CRIS keeps the relocation value in the r_addend field and |
| 907 | * should not use whats in *loc at all | ||
| 908 | */ | ||
| 947 | *loc = v; | 909 | *loc = v; |
| 948 | break; | 910 | break; |
| 949 | 911 | ||
| 950 | case R_390_RELATIVE: | 912 | #elif defined(__H8300H__) || defined(__H8300S__) |
| 951 | *loc += f->baseaddr; | ||
| 952 | break; | ||
| 953 | 913 | ||
| 954 | case R_390_GOTPC: | 914 | case R_H8_DIR24R8: |
| 955 | assert(got != 0); | 915 | loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1); |
| 956 | *(unsigned long *) loc += got - dot; | 916 | *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v); |
| 957 | break; | 917 | break; |
| 958 | 918 | case R_H8_DIR24A8: | |
| 959 | case R_390_GOT12: | 919 | *loc += v; |
| 960 | case R_390_GOT16: | ||
| 961 | case R_390_GOT32: | ||
| 962 | assert(isym != NULL); | ||
| 963 | assert(got != 0); | ||
| 964 | if (!isym->gotent.inited) | ||
| 965 | { | ||
| 966 | isym->gotent.inited = 1; | ||
| 967 | *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v; | ||
| 968 | } | ||
| 969 | if (ELF_R_TYPE(rel->r_info) == R_390_GOT12) | ||
| 970 | *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff; | ||
| 971 | else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16) | ||
| 972 | *(unsigned short *) loc += isym->gotent.offset; | ||
| 973 | else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32) | ||
| 974 | *(unsigned int *) loc += isym->gotent.offset; | ||
| 975 | break; | 920 | break; |
| 976 | 921 | case R_H8_DIR32: | |
| 977 | #ifndef R_390_GOTOFF32 | 922 | case R_H8_DIR32A16: |
| 978 | #define R_390_GOTOFF32 R_390_GOTOFF | 923 | *loc += v; |
| 979 | #endif | 924 | break; |
| 980 | case R_390_GOTOFF32: | 925 | case R_H8_PCREL16: |
| 981 | assert(got != 0); | 926 | v -= dot + 2; |
| 982 | *loc += v - got; | 927 | if ((ElfW(Sword))v > 0x7fff || |
| 928 | (ElfW(Sword))v < -(ElfW(Sword))0x8000) | ||
| 929 | ret = obj_reloc_overflow; | ||
| 930 | else | ||
| 931 | *(unsigned short *)loc = v; | ||
| 932 | break; | ||
| 933 | case R_H8_PCREL8: | ||
| 934 | v -= dot + 1; | ||
| 935 | if ((ElfW(Sword))v > 0x7f || | ||
| 936 | (ElfW(Sword))v < -(ElfW(Sword))0x80) | ||
| 937 | ret = obj_reloc_overflow; | ||
| 938 | else | ||
| 939 | *(unsigned char *)loc = v; | ||
| 983 | break; | 940 | break; |
| 984 | 941 | ||
| 985 | #elif defined(__i386__) | 942 | #elif defined(__i386__) |
| @@ -1018,75 +975,6 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1018 | *loc += v - got; | 975 | *loc += v - got; |
| 1019 | break; | 976 | break; |
| 1020 | 977 | ||
| 1021 | #elif defined(__x86_64__) | ||
| 1022 | |||
| 1023 | case R_X86_64_NONE: | ||
| 1024 | break; | ||
| 1025 | |||
| 1026 | case R_X86_64_64: | ||
| 1027 | *loc += v; | ||
| 1028 | break; | ||
| 1029 | |||
| 1030 | case R_X86_64_32: | ||
| 1031 | *(unsigned int *) loc += v; | ||
| 1032 | if (v > 0xffffffff) | ||
| 1033 | { | ||
| 1034 | ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */ | ||
| 1035 | /* error("Possibly is module compiled without -mcmodel=kernel!"); */ | ||
| 1036 | } | ||
| 1037 | break; | ||
| 1038 | |||
| 1039 | case R_X86_64_32S: | ||
| 1040 | *(signed int *) loc += v; | ||
| 1041 | break; | ||
| 1042 | |||
| 1043 | case R_X86_64_16: | ||
| 1044 | *(unsigned short *) loc += v; | ||
| 1045 | break; | ||
| 1046 | |||
| 1047 | case R_X86_64_8: | ||
| 1048 | *(unsigned char *) loc += v; | ||
| 1049 | break; | ||
| 1050 | |||
| 1051 | case R_X86_64_PC32: | ||
| 1052 | *(unsigned int *) loc += v - dot; | ||
| 1053 | break; | ||
| 1054 | |||
| 1055 | case R_X86_64_PC16: | ||
| 1056 | *(unsigned short *) loc += v - dot; | ||
| 1057 | break; | ||
| 1058 | |||
| 1059 | case R_X86_64_PC8: | ||
| 1060 | *(unsigned char *) loc += v - dot; | ||
| 1061 | break; | ||
| 1062 | |||
| 1063 | case R_X86_64_GLOB_DAT: | ||
| 1064 | case R_X86_64_JUMP_SLOT: | ||
| 1065 | *loc = v; | ||
| 1066 | break; | ||
| 1067 | |||
| 1068 | case R_X86_64_RELATIVE: | ||
| 1069 | *loc += f->baseaddr; | ||
| 1070 | break; | ||
| 1071 | |||
| 1072 | case R_X86_64_GOT32: | ||
| 1073 | case R_X86_64_GOTPCREL: | ||
| 1074 | goto bb_use_got; | ||
| 1075 | #if 0 | ||
| 1076 | assert(isym != NULL); | ||
| 1077 | if (!isym->gotent.reloc_done) | ||
| 1078 | { | ||
| 1079 | isym->gotent.reloc_done = 1; | ||
| 1080 | *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v; | ||
| 1081 | } | ||
| 1082 | /* XXX are these really correct? */ | ||
| 1083 | if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL) | ||
| 1084 | *(unsigned int *) loc += v + isym->gotent.offset; | ||
| 1085 | else | ||
| 1086 | *loc += isym->gotent.offset; | ||
| 1087 | break; | ||
| 1088 | #endif | ||
| 1089 | |||
| 1090 | #elif defined(__mc68000__) | 978 | #elif defined(__mc68000__) |
| 1091 | 979 | ||
| 1092 | case R_68K_NONE: | 980 | case R_68K_NONE: |
| @@ -1144,12 +1032,12 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1144 | case R_68K_GOT32: | 1032 | case R_68K_GOT32: |
| 1145 | goto bb_use_got; | 1033 | goto bb_use_got; |
| 1146 | 1034 | ||
| 1147 | #ifdef R_68K_GOTOFF | 1035 | # ifdef R_68K_GOTOFF |
| 1148 | case R_68K_GOTOFF: | 1036 | case R_68K_GOTOFF: |
| 1149 | assert(got != 0); | 1037 | assert(got != 0); |
| 1150 | *loc += v - got; | 1038 | *loc += v - got; |
| 1151 | break; | 1039 | break; |
| 1152 | #endif | 1040 | # endif |
| 1153 | 1041 | ||
| 1154 | #elif defined(__mips__) | 1042 | #elif defined(__mips__) |
| 1155 | 1043 | ||
| @@ -1263,6 +1151,93 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1263 | *loc = v; | 1151 | *loc = v; |
| 1264 | break; | 1152 | break; |
| 1265 | 1153 | ||
| 1154 | #elif defined(__s390__) | ||
| 1155 | |||
| 1156 | case R_390_32: | ||
| 1157 | *(unsigned int *) loc += v; | ||
| 1158 | break; | ||
| 1159 | case R_390_16: | ||
| 1160 | *(unsigned short *) loc += v; | ||
| 1161 | break; | ||
| 1162 | case R_390_8: | ||
| 1163 | *(unsigned char *) loc += v; | ||
| 1164 | break; | ||
| 1165 | |||
| 1166 | case R_390_PC32: | ||
| 1167 | *(unsigned int *) loc += v - dot; | ||
| 1168 | break; | ||
| 1169 | case R_390_PC16DBL: | ||
| 1170 | *(unsigned short *) loc += (v - dot) >> 1; | ||
| 1171 | break; | ||
| 1172 | case R_390_PC16: | ||
| 1173 | *(unsigned short *) loc += v - dot; | ||
| 1174 | break; | ||
| 1175 | |||
| 1176 | case R_390_PLT32: | ||
| 1177 | case R_390_PLT16DBL: | ||
| 1178 | /* find the plt entry and initialize it. */ | ||
| 1179 | assert(isym != NULL); | ||
| 1180 | pe = (struct arch_single_entry *) &isym->pltent; | ||
| 1181 | assert(pe->allocated); | ||
| 1182 | if (pe->inited == 0) { | ||
| 1183 | ip = (unsigned long *)(ifile->plt->contents + pe->offset); | ||
| 1184 | ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */ | ||
| 1185 | ip[1] = 0x100607f1; | ||
| 1186 | if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL) | ||
| 1187 | ip[2] = v - 2; | ||
| 1188 | else | ||
| 1189 | ip[2] = v; | ||
| 1190 | pe->inited = 1; | ||
| 1191 | } | ||
| 1192 | |||
| 1193 | /* Insert relative distance to target. */ | ||
| 1194 | v = plt + pe->offset - dot; | ||
| 1195 | if (ELF_R_TYPE(rel->r_info) == R_390_PLT32) | ||
| 1196 | *(unsigned int *) loc = (unsigned int) v; | ||
| 1197 | else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL) | ||
| 1198 | *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1); | ||
| 1199 | break; | ||
| 1200 | |||
| 1201 | case R_390_GLOB_DAT: | ||
| 1202 | case R_390_JMP_SLOT: | ||
| 1203 | *loc = v; | ||
| 1204 | break; | ||
| 1205 | |||
| 1206 | case R_390_RELATIVE: | ||
| 1207 | *loc += f->baseaddr; | ||
| 1208 | break; | ||
| 1209 | |||
| 1210 | case R_390_GOTPC: | ||
| 1211 | assert(got != 0); | ||
| 1212 | *(unsigned long *) loc += got - dot; | ||
| 1213 | break; | ||
| 1214 | |||
| 1215 | case R_390_GOT12: | ||
| 1216 | case R_390_GOT16: | ||
| 1217 | case R_390_GOT32: | ||
| 1218 | assert(isym != NULL); | ||
| 1219 | assert(got != 0); | ||
| 1220 | if (!isym->gotent.inited) | ||
| 1221 | { | ||
| 1222 | isym->gotent.inited = 1; | ||
| 1223 | *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v; | ||
| 1224 | } | ||
| 1225 | if (ELF_R_TYPE(rel->r_info) == R_390_GOT12) | ||
| 1226 | *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff; | ||
| 1227 | else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16) | ||
| 1228 | *(unsigned short *) loc += isym->gotent.offset; | ||
| 1229 | else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32) | ||
| 1230 | *(unsigned int *) loc += isym->gotent.offset; | ||
| 1231 | break; | ||
| 1232 | |||
| 1233 | # ifndef R_390_GOTOFF32 | ||
| 1234 | # define R_390_GOTOFF32 R_390_GOTOFF | ||
| 1235 | # endif | ||
| 1236 | case R_390_GOTOFF32: | ||
| 1237 | assert(got != 0); | ||
| 1238 | *loc += v - got; | ||
| 1239 | break; | ||
| 1240 | |||
| 1266 | #elif defined(__sh__) | 1241 | #elif defined(__sh__) |
| 1267 | 1242 | ||
| 1268 | case R_SH_NONE: | 1243 | case R_SH_NONE: |
| @@ -1302,7 +1277,7 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1302 | *loc = v - got; | 1277 | *loc = v - got; |
| 1303 | break; | 1278 | break; |
| 1304 | 1279 | ||
| 1305 | #if defined(__SH5__) | 1280 | # if defined(__SH5__) |
| 1306 | case R_SH_IMM_MEDLOW16: | 1281 | case R_SH_IMM_MEDLOW16: |
| 1307 | case R_SH_IMM_LOW16: | 1282 | case R_SH_IMM_LOW16: |
| 1308 | { | 1283 | { |
| @@ -1345,15 +1320,10 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1345 | 1320 | ||
| 1346 | break; | 1321 | break; |
| 1347 | } | 1322 | } |
| 1348 | #endif /* __SH5__ */ | 1323 | # endif /* __SH5__ */ |
| 1349 | #endif /* __sh__ */ | ||
| 1350 | 1324 | ||
| 1351 | default: | 1325 | #elif defined (__v850e__) |
| 1352 | printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info)); | ||
| 1353 | ret = obj_reloc_unhandled; | ||
| 1354 | break; | ||
| 1355 | 1326 | ||
| 1356 | #if defined (__v850e__) | ||
| 1357 | case R_V850_NONE: | 1327 | case R_V850_NONE: |
| 1358 | break; | 1328 | break; |
| 1359 | 1329 | ||
| @@ -1369,50 +1339,83 @@ arch_apply_relocation(struct obj_file *f, | |||
| 1369 | 1339 | ||
| 1370 | case R_V850_22_PCREL: | 1340 | case R_V850_22_PCREL: |
| 1371 | goto bb_use_plt; | 1341 | goto bb_use_plt; |
| 1372 | #endif | ||
| 1373 | 1342 | ||
| 1374 | #if defined (__cris__) | 1343 | #elif defined(__x86_64__) |
| 1375 | case R_CRIS_NONE: | 1344 | #warning hi |
| 1345 | case R_X86_64_NONE: | ||
| 1376 | break; | 1346 | break; |
| 1377 | 1347 | ||
| 1378 | case R_CRIS_32: | 1348 | case R_X86_64_64: |
| 1379 | /* CRIS keeps the relocation value in the r_addend field and | 1349 | *loc += v; |
| 1380 | * should not use whats in *loc at all | ||
| 1381 | */ | ||
| 1382 | *loc = v; | ||
| 1383 | break; | 1350 | break; |
| 1384 | #endif | ||
| 1385 | 1351 | ||
| 1386 | #if defined(__H8300H__) || defined(__H8300S__) | 1352 | case R_X86_64_32: |
| 1387 | case R_H8_DIR24R8: | 1353 | *(unsigned int *) loc += v; |
| 1388 | loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1); | 1354 | if (v > 0xffffffff) |
| 1389 | *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v); | 1355 | { |
| 1356 | ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */ | ||
| 1357 | /* error("Possibly is module compiled without -mcmodel=kernel!"); */ | ||
| 1358 | } | ||
| 1390 | break; | 1359 | break; |
| 1391 | case R_H8_DIR24A8: | 1360 | |
| 1392 | *loc += v; | 1361 | case R_X86_64_32S: |
| 1362 | *(signed int *) loc += v; | ||
| 1393 | break; | 1363 | break; |
| 1394 | case R_H8_DIR32: | 1364 | |
| 1395 | case R_H8_DIR32A16: | 1365 | case R_X86_64_16: |
| 1396 | *loc += v; | 1366 | *(unsigned short *) loc += v; |
| 1397 | break; | 1367 | break; |
| 1398 | case R_H8_PCREL16: | 1368 | |
| 1399 | v -= dot + 2; | 1369 | case R_X86_64_8: |
| 1400 | if ((ElfW(Sword))v > 0x7fff || | 1370 | *(unsigned char *) loc += v; |
| 1401 | (ElfW(Sword))v < -(ElfW(Sword))0x8000) | ||
| 1402 | ret = obj_reloc_overflow; | ||
| 1403 | else | ||
| 1404 | *(unsigned short *)loc = v; | ||
| 1405 | break; | 1371 | break; |
| 1406 | case R_H8_PCREL8: | 1372 | |
| 1407 | v -= dot + 1; | 1373 | case R_X86_64_PC32: |
| 1408 | if ((ElfW(Sword))v > 0x7f || | 1374 | *(unsigned int *) loc += v - dot; |
| 1409 | (ElfW(Sword))v < -(ElfW(Sword))0x80) | 1375 | break; |
| 1410 | ret = obj_reloc_overflow; | 1376 | |
| 1377 | case R_X86_64_PC16: | ||
| 1378 | *(unsigned short *) loc += v - dot; | ||
| 1379 | break; | ||
| 1380 | |||
| 1381 | case R_X86_64_PC8: | ||
| 1382 | *(unsigned char *) loc += v - dot; | ||
| 1383 | break; | ||
| 1384 | |||
| 1385 | case R_X86_64_GLOB_DAT: | ||
| 1386 | case R_X86_64_JUMP_SLOT: | ||
| 1387 | *loc = v; | ||
| 1388 | break; | ||
| 1389 | |||
| 1390 | case R_X86_64_RELATIVE: | ||
| 1391 | *loc += f->baseaddr; | ||
| 1392 | break; | ||
| 1393 | |||
| 1394 | case R_X86_64_GOT32: | ||
| 1395 | case R_X86_64_GOTPCREL: | ||
| 1396 | goto bb_use_got; | ||
| 1397 | # if 0 | ||
| 1398 | assert(isym != NULL); | ||
| 1399 | if (!isym->gotent.reloc_done) | ||
| 1400 | { | ||
| 1401 | isym->gotent.reloc_done = 1; | ||
| 1402 | *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v; | ||
| 1403 | } | ||
| 1404 | /* XXX are these really correct? */ | ||
| 1405 | if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL) | ||
| 1406 | *(unsigned int *) loc += v + isym->gotent.offset; | ||
| 1411 | else | 1407 | else |
| 1412 | *(unsigned char *)loc = v; | 1408 | *loc += isym->gotent.offset; |
| 1413 | break; | 1409 | break; |
| 1410 | # endif | ||
| 1411 | |||
| 1414 | #endif | 1412 | #endif |
| 1415 | 1413 | ||
| 1414 | default: | ||
| 1415 | printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info)); | ||
| 1416 | ret = obj_reloc_unhandled; | ||
| 1417 | break; | ||
| 1418 | |||
| 1416 | #if defined(CONFIG_USE_PLT_ENTRIES) | 1419 | #if defined(CONFIG_USE_PLT_ENTRIES) |
| 1417 | 1420 | ||
| 1418 | bb_use_plt: | 1421 | bb_use_plt: |
