diff options
author | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-10-02 06:44:39 +0000 |
---|---|---|
committer | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-10-02 06:44:39 +0000 |
commit | ec34094e3dbf8bdbd1e0376a31d7f898fef5649f (patch) | |
tree | db98af0647fad701f74ff58ef1b0ecbd3456900b /modutils/insmod.c | |
parent | c1942887734e17b6458dd37963c88724ebe9c718 (diff) | |
download | busybox-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.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: |