]> git.proxmox.com Git - grub2.git/commitdiff
Fix LTOFF relocation to functions (needed for trampolines)
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 8 May 2011 15:07:40 +0000 (17:07 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 8 May 2011 15:07:40 +0000 (17:07 +0200)
grub-core/kern/ia64/dl.c
util/grub-mkimagexx.c

index 0d1e0d2e6692273d6c924ca6da792e718a53ca04..3904f73b7c2f4f9c548ed89208ff23d7edf753df 100644 (file)
@@ -250,9 +250,11 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
                    add_value_to_slot_21 (addr, value - (grub_addr_t) gp);
                    break;
 
-                 case R_IA64_LTOFF_FPTR22:
                  case R_IA64_LTOFF22X:
                  case R_IA64_LTOFF22:
+                   if (ELF_ST_TYPE (sym->st_info) == STT_FUNC)
+                     value = *(grub_uint64_t *) sym->st_value + rel->r_addend;
+                 case R_IA64_LTOFF_FPTR22:
                    *gpptr = value;
                    add_value_to_slot_21 (addr, (grub_addr_t) gpptr - (grub_addr_t) gp);
                    gpptr++;
index 9bfb5de7540d20e257fe465944cbb36e13c7b11c..35229107056c20e672c2ab9a5bde76b0b8991703 100644 (file)
@@ -455,9 +455,20 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
                  }
                  break;
 
-               case R_IA64_LTOFF_FPTR22:
                case R_IA64_LTOFF22X:
                case R_IA64_LTOFF22:
+                 {
+                   Elf_Sym *sym;
+
+                   sym = (Elf_Sym *) ((char *) e
+                                      + grub_target_to_host32 (symtab_section->sh_offset)
+                                      + ELF_R_SYM (info) * grub_target_to_host32 (symtab_section->sh_entsize));
+                   if (ELF_ST_TYPE (sym->st_info) == STT_FUNC)
+                     sym_addr = grub_target_to_host64 (*(grub_uint64_t *) (pe_target
+                                                                           + sym->st_value
+                                                                           - image_target->vaddr_offset));
+                 }
+               case R_IA64_LTOFF_FPTR22:
                  *gpptr = grub_host_to_target64 (addend + sym_addr);
                  add_value_to_slot_21 ((grub_addr_t) target,
                                        (char *) gpptr - (char *) pe_target