diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2005-10-02 06:44:39 +0000 |
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2005-10-02 06:44:39 +0000 |
| commit | 91fbdac6ab5439163124a6b32ed602e2d21affd7 (patch) | |
| tree | db98af0647fad701f74ff58ef1b0ecbd3456900b /modutils | |
| parent | e6d5539ebb4ba8d2260af20dfc79702aa61aa454 (diff) | |
| download | busybox-w32-91fbdac6ab5439163124a6b32ed602e2d21affd7.tar.gz busybox-w32-91fbdac6ab5439163124a6b32ed602e2d21affd7.tar.bz2 busybox-w32-91fbdac6ab5439163124a6b32ed602e2d21affd7.zip | |
svdavidson writes in Bug 459: add support for x86_64 relocations from modutils 2.4.27
Diffstat (limited to 'modutils')
| -rw-r--r-- | modutils/insmod.c | 73 |
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: |
