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
This commit is contained in:
Konstantin Belousov 2018-01-11 13:57:30 +00:00
parent 147b0c1a3e
commit 85f794e126
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=327822

View File

@ -115,6 +115,7 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr, const void *reldata,
/* 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, const void *reldata,
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, const void *reldata,
#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:
@ -186,6 +191,9 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr, const void *reldata,
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);
return (EFTYPE);