]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Handle X86_64_PC64 relocation.
authorVladimir Serbinenko <phcoder@gmail.com>
Mon, 16 Dec 2013 13:24:19 +0000 (14:24 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Mon, 16 Dec 2013 13:24:19 +0000 (14:24 +0100)
Those are generated by some cygwin compilers.

ChangeLog
grub-core/kern/x86_64/dl.c
include/grub/elf.h
util/grub-mkimagexx.c

index 5405e5069ae5acc54001d13123dfc52599b26ef2..aae9c69770c9e2d1d135d666d03dcf5345d22de1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-12-16  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Handle X86_64_PC64 relocation.
+
+       Those are generated by some cygwin compilers.
+
 2013-12-16  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Determine the need for mingw-related stubs at compile time rather than
index e00e51d4027cda1cd64aa2c797b52383fe88ec7c..6cb88bfcc7e19ef8f0e3c5529c9cde2f8a5f4d76 100644 (file)
@@ -80,6 +80,13 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
          }
          break;
 
+       case R_X86_64_PC64:
+         {
+           *addr64 += rel->r_addend + sym->st_value -
+             (Elf64_Xword) seg->addr - rel->r_offset;
+         }
+         break;
+
        case R_X86_64_32:
          {
            grub_uint64_t value = *addr32 + rel->r_addend + sym->st_value;
index 140d24d0246a856d33b7d061eea5fce9b37adb66..79f56c67bb0d26b04e3a4b66d8385ba27fa8f801 100644 (file)
@@ -1132,6 +1132,7 @@ typedef struct
 #define R_X86_64_PC16          13
 #define R_X86_64_8             14
 #define R_X86_64_PC8           15
+#define R_X86_64_PC64          24
 
 /* Legal values for ST_TYPE subfield of st_info (symbol type).  */
 
index d6feffd2a1541be43970a9c187d88711bc5de05e..832302e59e4f9d377304ac39c01933741a080618 100644 (file)
@@ -709,6 +709,18 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
                    break;
                  }
 
+               case R_X86_64_PC64:
+                 {
+                   *target = grub_host_to_target64 (grub_target_to_host64 (*target)
+                                                    + addend + sym_addr
+                                                    - target_section_addr - offset
+                                                    - image_target->vaddr_offset);
+                   grub_util_info ("relocating an R_X86_64_PC64 entry to 0x%llx at the offset 0x%llx",
+                                   (unsigned long long) *target,
+                                   (unsigned long long) offset);
+                   break;
+                 }
+
                case R_X86_64_32:
                case R_X86_64_32S:
                  {