aboutsummaryrefslogtreecommitdiff
path: root/modutils/insmod.c
diff options
context:
space:
mode:
authorvapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-10-02 06:44:39 +0000
committervapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-10-02 06:44:39 +0000
commitec34094e3dbf8bdbd1e0376a31d7f898fef5649f (patch)
treedb98af0647fad701f74ff58ef1b0ecbd3456900b /modutils/insmod.c
parentc1942887734e17b6458dd37963c88724ebe9c718 (diff)
downloadbusybox-w32-ec34094e3dbf8bdbd1e0376a31d7f898fef5649f.tar.gz
busybox-w32-ec34094e3dbf8bdbd1e0376a31d7f898fef5649f.tar.bz2
busybox-w32-ec34094e3dbf8bdbd1e0376a31d7f898fef5649f.zip
svdavidson writes in Bug 459: add support for x86_64 relocations from modutils 2.4.27
git-svn-id: svn://busybox.net/trunk/busybox@11724 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'modutils/insmod.c')
-rw-r--r--modutils/insmod.c73
1 files changed, 72 insertions, 1 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c
index 94e66f48c..38bddbb6f 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -296,6 +296,9 @@ extern int insmod_ng_main( int argc, char **argv);
296#if defined(__x86_64__) 296#if defined(__x86_64__)
297#define MATCH_MACHINE(x) (x == EM_X86_64) 297#define MATCH_MACHINE(x) (x == EM_X86_64)
298#define SHT_RELM SHT_RELA 298#define SHT_RELM SHT_RELA
299#define CONFIG_USE_GOT_ENTRIES
300#define CONFIG_GOT_ENTRY_SIZE 8
301#define CONFIG_USE_SINGLE
299#define Elf64_RelM Elf64_Rela 302#define Elf64_RelM Elf64_Rela
300#define ELFCLASSM ELFCLASS64 303#define ELFCLASSM ELFCLASS64
301#endif 304#endif
@@ -858,7 +861,6 @@ arch_apply_relocation(struct obj_file *f,
858 861
859 switch (ELF32_R_TYPE(rel->r_info)) { 862 switch (ELF32_R_TYPE(rel->r_info)) {
860 863
861
862#if defined(__arm__) 864#if defined(__arm__)
863 case R_ARM_NONE: 865 case R_ARM_NONE:
864 break; 866 break;
@@ -1010,6 +1012,75 @@ arch_apply_relocation(struct obj_file *f,
1010 *loc += v - got; 1012 *loc += v - got;
1011 break; 1013 break;
1012 1014
1015#elif defined(__x86_64__)
1016
1017 case R_X86_64_NONE:
1018 break;
1019
1020 case R_X86_64_64:
1021 *loc += v;
1022 break;
1023
1024 case R_X86_64_32:
1025 *(unsigned int *) loc += v;
1026 if (v > 0xffffffff)
1027 {
1028 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1029 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1030 }
1031 break;
1032
1033 case R_X86_64_32S:
1034 *(signed int *) loc += v;
1035 break;
1036
1037 case R_X86_64_16:
1038 *(unsigned short *) loc += v;
1039 break;
1040
1041 case R_X86_64_8:
1042 *(unsigned char *) loc += v;
1043 break;
1044
1045 case R_X86_64_PC32:
1046 *(unsigned int *) loc += v - dot;
1047 break;
1048
1049 case R_X86_64_PC16:
1050 *(unsigned short *) loc += v - dot;
1051 break;
1052
1053 case R_X86_64_PC8:
1054 *(unsigned char *) loc += v - dot;
1055 break;
1056
1057 case R_X86_64_GLOB_DAT:
1058 case R_X86_64_JUMP_SLOT:
1059 *loc = v;
1060 break;
1061
1062 case R_X86_64_RELATIVE:
1063 *loc += f->baseaddr;
1064 break;
1065
1066 case R_X86_64_GOT32:
1067 case R_X86_64_GOTPCREL:
1068 goto bb_use_got;
1069#if 0
1070 assert(isym != NULL);
1071 if (!isym->gotent.reloc_done)
1072 {
1073 isym->gotent.reloc_done = 1;
1074 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1075 }
1076 /* XXX are these really correct? */
1077 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1078 *(unsigned int *) loc += v + isym->gotent.offset;
1079 else
1080 *loc += isym->gotent.offset;
1081 break;
1082#endif
1083
1013#elif defined(__mc68000__) 1084#elif defined(__mc68000__)
1014 1085
1015 case R_68K_NONE: 1086 case R_68K_NONE: