aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2005-10-02 07:50:49 +0000
committerMike Frysinger <vapier@gentoo.org>2005-10-02 07:50:49 +0000
commitcb1ce7b9748974aab2f6246ecb9bfb8388a1009b (patch)
treef0ad90a45be921479cbd3663f487a365888afae2
parentfa17c4b94951374c919c6a099db9dcfcc2487c19 (diff)
downloadbusybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.tar.gz
busybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.tar.bz2
busybox-w32-cb1ce7b9748974aab2f6246ecb9bfb8388a1009b.zip
reorder arches into alphabetical order
-rw-r--r--modutils/insmod.c399
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
1418bb_use_plt: 1421bb_use_plt: