svn commit: r327822 - head/stand/common

Konstantin Belousov kib at FreeBSD.org
Thu Jan 11 13:57:31 UTC 2018


Author: kib
Date: Thu Jan 11 13:57:30 2018
New Revision: 327822
URL: https://svnweb.freebsd.org/changeset/base/327822

Log:
  Skip IRELATIVE relocations when loader processes ELF files.
  
  ifuncs can be only called in the (early boot) kernel environment, so
  postpone resolving until early stage of the kernel boot.  This commit
  is performed in advance to make loaders on most machines updated
  before ifuncs appear in the kernels.
  
  Reviewed by:	emaste, jhb
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D13838

Modified:
  head/stand/common/reloc_elf.c

Modified: head/stand/common/reloc_elf.c
==============================================================================
--- head/stand/common/reloc_elf.c	Thu Jan 11 13:37:45 2018	(r327821)
+++ head/stand/common/reloc_elf.c	Thu Jan 11 13:57:30 2018	(r327822)
@@ -115,6 +115,7 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr
 /* XXX, definitions not available on i386. */
 #define	R_X86_64_64		1
 #define	R_X86_64_RELATIVE	8
+#define	R_X86_64_IRELATIVE	37
 
 	switch (rtype) {
 	case R_X86_64_64:		/* S + A */
@@ -129,6 +130,9 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr
 		val = addr;
 		*where = val;
 		break;
+	case R_X86_64_IRELATIVE:
+		/* leave it to kernel */
+		break;
 	default:
 		printf("\nunhandled relocation type %u\n", (u_int)rtype);
 		return (EFTYPE);
@@ -173,6 +177,7 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr
 #define R_386_32	1	/* Add symbol value. */
 #define R_386_GLOB_DAT	6	/* Set GOT entry to data address. */
 #define R_386_RELATIVE	8	/* Add load address of shared object. */
+#define	R_386_IRELATIVE	42
 
 	switch (rtype) {
 	case R_386_RELATIVE:
@@ -185,6 +190,9 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr
 			return (ESRCH);
 		val = addr + addend;
 		*where = val;
+		break;
+	case R_386_IRELATIVE:
+		/* leave it to kernel */
 		break;
 	default:
 		printf("\nunhandled relocation type %u\n", (u_int)rtype);


More information about the svn-src-head mailing list