summaryrefslogtreecommitdiff
path: root/i386/i386at/boothdr.S
diff options
context:
space:
mode:
Diffstat (limited to 'i386/i386at/boothdr.S')
-rw-r--r--i386/i386at/boothdr.S17
1 files changed, 17 insertions, 0 deletions
diff --git a/i386/i386at/boothdr.S b/i386/i386at/boothdr.S
index 27d0405..45cd599 100644
--- a/i386/i386at/boothdr.S
+++ b/i386/i386at/boothdr.S
@@ -58,6 +58,23 @@ boot_entry:
/* Push the boot_info pointer to be the second argument. */
pushl %ebx
+ /* Fix ifunc entries */
+ movl $__rel_iplt_start,%esi
+ movl $__rel_iplt_end,%edi
+iplt_cont:
+ cmpl %edi,%esi
+ jae iplt_done
+ movl (%esi),%ebx /* r_offset */
+ movb 4(%esi),%al /* info */
+ cmpb $42,%al /* IRELATIVE */
+ jnz iplt_next
+ call *(%ebx) /* call ifunc */
+ movl %eax,(%ebx) /* fixed address */
+iplt_next:
+ addl $8,%esi
+ jmp iplt_cont
+iplt_done:
+
/* Jump into C code. */
call EXT(c_boot_entry)