svn commit: r427378 - in head/devel/binutils: . files
Andrew Turner
andrew at FreeBSD.org
Tue Nov 29 13:44:48 UTC 2016
Author: andrew (src committer)
Date: Tue Nov 29 13:44:46 2016
New Revision: 427378
URL: https://svnweb.freebsd.org/changeset/ports/427378
Log:
Fix booting the arm64 kernel when built with clang 3.9.0
Clang 3.9.0 changes how weak extern is handled. They now use the got to
handle them. This is a problem as ld.bfd doesn't fill out any default value
in the got so pointers become NULL. This caused the kernel to fail to boot
as we use this in linker sets.
This fixes the issue by setting a default value in the got. The kernel
still loads data through it, but because we always load it at a fixed
virtual address the address it finds is valid.
Approved by: bapt
Differential Revision: https://reviews.freebsd.org/D8622
Added:
head/devel/binutils/files/patch-bfd_elfnn-aarch64.c (contents, props changed)
Modified:
head/devel/binutils/Makefile
Modified: head/devel/binutils/Makefile
==============================================================================
--- head/devel/binutils/Makefile Tue Nov 29 13:01:46 2016 (r427377)
+++ head/devel/binutils/Makefile Tue Nov 29 13:44:46 2016 (r427378)
@@ -3,7 +3,7 @@
PORTNAME= binutils
PORTVERSION= 2.27
-PORTREVISION= 4
+PORTREVISION= 5
PORTEPOCH?= 1
CATEGORIES?= devel
MASTER_SITES= SOURCEWARE/binutils/releases
Added: head/devel/binutils/files/patch-bfd_elfnn-aarch64.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/devel/binutils/files/patch-bfd_elfnn-aarch64.c Tue Nov 29 13:44:46 2016 (r427378)
@@ -0,0 +1,28 @@
+--- bfd/elfnn-aarch64.c.orig 2016-11-20 12:04:44.613621000 +0000
++++ bfd/elfnn-aarch64.c 2016-11-20 12:05:01.143334000 +0000
+@@ -4369,7 +4369,9 @@
+ off = h->got.offset;
+ BFD_ASSERT (off != (bfd_vma) - 1);
+ if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
+- || (bfd_link_pic (info)
++ || ((bfd_link_pic (info)
++ || (!bfd_link_relocatable (info)
++ && (info->export_dynamic || info->dynamic)))
+ && SYMBOL_REFERENCES_LOCAL (info, h))
+ || (ELF_ST_VISIBILITY (h->other)
+ && h->root.type == bfd_link_hash_undefweak))
+@@ -8891,6 +8893,14 @@
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+ }
++ else if (!bfd_link_relocatable (info)
++ && (info->export_dynamic || info->dynamic)
++ && SYMBOL_REFERENCES_LOCAL (info, h))
++ {
++ BFD_ASSERT ((h->got.offset & 1) != 0);
++ rela.r_info = ELFNN_R_INFO (h->dynindx, AARCH64_R (GLOB_DAT));
++ rela.r_addend = 0;
++ }
+ else
+ {
+ do_glob_dat:
More information about the svn-ports-all
mailing list