svn commit: r296439 - in stable/9/sys: boot/common kern
Dimitry Andric
dim at FreeBSD.org
Mon Mar 7 07:57:58 UTC 2016
Author: dim
Date: Mon Mar 7 07:57:57 2016
New Revision: 296439
URL: https://svnweb.freebsd.org/changeset/base/296439
Log:
MFC r296419 (by kib):
In the link_elf_obj.c, handle sections of type SHT_AMD64_UNWIND same
as SHT_PROGBITS. This is needed after the clang 3.8 import, which
generates that type for .eh_frame section, which had SHT_PROGBITS type
before.
Reported by: Nikolai Lifanov <lifanov at mail.lifanov.com>
PR: 207729
Tested by: dim (previous version)
Sponsored by: The FreeBSD Foundation
MFC r296428:
Since kernel modules can now contain sections of type SHT_AMD64_UNWIND,
the boot loader should not skip over these anymore while loading images.
Otherwise the kernel can still panic when it doesn't find the .eh_frame
section belonging to the .rela.eh_frame section.
Unfortunately this will require installing boot loaders from sys/boot
before attempting to boot with a new kernel.
Reviewed by: kib
Modified:
stable/9/sys/boot/common/load_elf_obj.c
stable/9/sys/kern/link_elf_obj.c
Directory Properties:
stable/9/ (props changed)
stable/9/sys/ (props changed)
stable/9/sys/boot/ (props changed)
Modified: stable/9/sys/boot/common/load_elf_obj.c
==============================================================================
--- stable/9/sys/boot/common/load_elf_obj.c Mon Mar 7 07:54:48 2016 (r296438)
+++ stable/9/sys/boot/common/load_elf_obj.c Mon Mar 7 07:57:57 2016 (r296439)
@@ -228,6 +228,9 @@ __elfN(obj_loadimage)(struct preloaded_f
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#if defined(__i386__) || defined(__amd64__)
+ case SHT_AMD64_UNWIND:
+#endif
lastaddr = roundup(lastaddr, shdr[i].sh_addralign);
shdr[i].sh_addr = (Elf_Addr)lastaddr;
lastaddr += shdr[i].sh_size;
Modified: stable/9/sys/kern/link_elf_obj.c
==============================================================================
--- stable/9/sys/kern/link_elf_obj.c Mon Mar 7 07:54:48 2016 (r296438)
+++ stable/9/sys/kern/link_elf_obj.c Mon Mar 7 07:57:57 2016 (r296439)
@@ -255,6 +255,9 @@ link_elf_link_preload(linker_class_t cls
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#ifdef __amd64__
+ case SHT_AMD64_UNWIND:
+#endif
ef->nprogtab++;
break;
case SHT_SYMTAB:
@@ -325,9 +328,16 @@ link_elf_link_preload(linker_class_t cls
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#ifdef __amd64__
+ case SHT_AMD64_UNWIND:
+#endif
ef->progtab[pb].addr = (void *)shdr[i].sh_addr;
if (shdr[i].sh_type == SHT_PROGBITS)
ef->progtab[pb].name = "<<PROGBITS>>";
+#ifdef __amd64__
+ else if (shdr[i].sh_type == SHT_AMD64_UNWIND)
+ ef->progtab[pb].name = "<<UNWIND>>";
+#endif
else
ef->progtab[pb].name = "<<NOBITS>>";
ef->progtab[pb].size = shdr[i].sh_size;
@@ -553,6 +563,9 @@ link_elf_load_file(linker_class_t cls, c
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#ifdef __amd64__
+ case SHT_AMD64_UNWIND:
+#endif
ef->nprogtab++;
break;
case SHT_SYMTAB:
@@ -659,6 +672,9 @@ link_elf_load_file(linker_class_t cls, c
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#ifdef __amd64__
+ case SHT_AMD64_UNWIND:
+#endif
alignmask = shdr[i].sh_addralign - 1;
mapsize += alignmask;
mapsize &= ~alignmask;
@@ -721,6 +737,9 @@ link_elf_load_file(linker_class_t cls, c
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
case SHT_NOBITS:
+#ifdef __amd64__
+ case SHT_AMD64_UNWIND:
+#endif
alignmask = shdr[i].sh_addralign - 1;
mapbase += alignmask;
mapbase &= ~alignmask;
@@ -729,6 +748,10 @@ link_elf_load_file(linker_class_t cls, c
ef->shstrtab + shdr[i].sh_name;
else if (shdr[i].sh_type == SHT_PROGBITS)
ef->progtab[pb].name = "<<PROGBITS>>";
+#ifdef __amd64__
+ else if (shdr[i].sh_type == SHT_AMD64_UNWIND)
+ ef->progtab[pb].name = "<<UNWIND>>";
+#endif
else
ef->progtab[pb].name = "<<NOBITS>>";
if (ef->progtab[pb].name != NULL &&
@@ -750,7 +773,11 @@ link_elf_load_file(linker_class_t cls, c
}
ef->progtab[pb].size = shdr[i].sh_size;
ef->progtab[pb].sec = i;
- if (shdr[i].sh_type == SHT_PROGBITS) {
+ if (shdr[i].sh_type == SHT_PROGBITS
+#ifdef __amd64__
+ || shdr[i].sh_type == SHT_AMD64_UNWIND
+#endif
+ ) {
error = vn_rdwr(UIO_READ, nd.ni_vp,
ef->progtab[pb].addr,
shdr[i].sh_size, shdr[i].sh_offset,
More information about the svn-src-stable-9
mailing list