delocate: Treat BORINGSSL_bcm_text_hash as a synthesized symbol

Otherwise the compiler may emit a GOT-based access to it. For some
reason, that combined with our synthesized symbols not being .globl
seems to cause the linker to resolve it to a completely random GOT entry
and get confused? I haven't fully figured out what's going on there.

Possibly these symbols should be .globl to support GOT accesses, but
given we don't want GOT accesses anyway, go ahead and correctly mark
them as synthesized symbols so we don't have this issue. (We probably
could have, equivalently, put a hidden visibility attribute on the decls
in the source code, and then the compiler wouldn't use the GOT at all.
But for now, I've kept solving this in the way we've solved this
before.)

This fixes the variant of crbug.com/520369788 I managed to repro, but
since the original bug contains insufficient information to reproduce it
(and what seems like hallucinations), I am not sure whether this
actually fixes it.

Bug: 520369788
Change-Id: I6b8103550fc2820aba8731e2d19cc2be1114b4e8
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/96887
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/util/fipstools/delocate/delocate.go b/util/fipstools/delocate/delocate.go
index cc7e312..fbbeb8b 100644
--- a/util/fipstools/delocate/delocate.go
+++ b/util/fipstools/delocate/delocate.go
@@ -1536,6 +1536,7 @@
 	// relocation.
 	symbols["BORINGSSL_bcm_text_start"] = struct{}{}
 	symbols["BORINGSSL_bcm_text_end"] = struct{}{}
+	symbols["BORINGSSL_bcm_text_hash"] = struct{}{}
 
 	d := &delocation{
 		symbols:             symbols,
@@ -1674,6 +1675,7 @@
 	w.WriteString(".type BORINGSSL_bcm_text_hash, @object\n")
 	w.WriteString(".size BORINGSSL_bcm_text_hash, 32\n")
 	w.WriteString("BORINGSSL_bcm_text_hash:\n")
+	w.WriteString(localTargetName("BORINGSSL_bcm_text_hash") + ":\n")
 	for _, b := range fipscommon.UninitHashValue {
 		w.WriteString(".byte 0x" + strconv.FormatUint(uint64(b), 16) + "\n")
 	}
diff --git a/util/fipstools/delocate/testdata/aarch64-Basic/in.s b/util/fipstools/delocate/testdata/aarch64-Basic/in.s
index 1e0d445..8f35ec6 100644
--- a/util/fipstools/delocate/testdata/aarch64-Basic/in.s
+++ b/util/fipstools/delocate/testdata/aarch64-Basic/in.s
@@ -16,6 +16,10 @@
 	// GOT load of synthesized symbol.
 	adrp x0, :got:BORINGSSL_bcm_text_start
 	ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_start]
+	adrp x0, :got:BORINGSSL_bcm_text_end
+	ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_end]
+	adrp x0, :got:BORINGSSL_bcm_text_hash
+	ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_hash]
 
 	// Address load
 	adrp x0, .Llocal_data
diff --git a/util/fipstools/delocate/testdata/aarch64-Basic/out.s b/util/fipstools/delocate/testdata/aarch64-Basic/out.s
index d92dc1c..54861a7 100644
--- a/util/fipstools/delocate/testdata/aarch64-Basic/out.s
+++ b/util/fipstools/delocate/testdata/aarch64-Basic/out.s
@@ -43,6 +43,14 @@
 	adrp x0, .LBORINGSSL_bcm_text_start_local_target
 	add x0, x0, :lo12:.LBORINGSSL_bcm_text_start_local_target
 // WAS ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_start]
+// WAS adrp x0, :got:BORINGSSL_bcm_text_end
+	adrp x0, .LBORINGSSL_bcm_text_end_local_target
+	add x0, x0, :lo12:.LBORINGSSL_bcm_text_end_local_target
+// WAS ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_end]
+// WAS adrp x0, :got:BORINGSSL_bcm_text_hash
+	adrp x0, .LBORINGSSL_bcm_text_hash_local_target
+	add x0, x0, :lo12:.LBORINGSSL_bcm_text_hash_local_target
+// WAS ldr x0, [x0, :got_lo12:BORINGSSL_bcm_text_hash]
 
 	// Address load
 // WAS adrp x0, .Llocal_data
@@ -247,6 +255,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/generic-AddrSig/out.s b/util/fipstools/delocate/testdata/generic-AddrSig/out.s
index b339896..d35303f 100644
--- a/util/fipstools/delocate/testdata/generic-AddrSig/out.s
+++ b/util/fipstools/delocate/testdata/generic-AddrSig/out.s
@@ -21,6 +21,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/generic-FileDirectives/out.s b/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
index fa888a9..f01ecd6 100644
--- a/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
+++ b/util/fipstools/delocate/testdata/generic-FileDirectives/out.s
@@ -16,6 +16,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-BSS/out.s b/util/fipstools/delocate/testdata/x86_64-BSS/out.s
index 0007639..ab9e97f 100644
--- a/util/fipstools/delocate/testdata/x86_64-BSS/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-BSS/out.s
@@ -89,6 +89,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-Basic/out.s b/util/fipstools/delocate/testdata/x86_64-Basic/out.s
index d0b8d55..6671ec9 100644
--- a/util/fipstools/delocate/testdata/x86_64-Basic/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-Basic/out.s
@@ -65,6 +65,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
index bec92c5..bce3395 100644
--- a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
+++ b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
@@ -26,6 +26,8 @@
 
 	# Synthesized symbols do not use the GOT.
 	movq BORINGSSL_bcm_text_start@GOTPCREL(%rip), %r11
+	movq BORINGSSL_bcm_text_end@GOTPCREL(%rip), %r11
+	movq BORINGSSL_bcm_text_hash@GOTPCREL(%rip), %r11
 	movq foobar_bss_get@GOTPCREL(%rip), %r11
 
 	# Transforming moves run the transform in-place after the load.
diff --git a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
index fdc7303..acd6654 100644
--- a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
@@ -106,6 +106,10 @@
 	# Synthesized symbols do not use the GOT.
 # WAS movq BORINGSSL_bcm_text_start@GOTPCREL(%rip), %r11
 	leaq	.LBORINGSSL_bcm_text_start_local_target(%rip), %r11
+# WAS movq BORINGSSL_bcm_text_end@GOTPCREL(%rip), %r11
+	leaq	.LBORINGSSL_bcm_text_end_local_target(%rip), %r11
+# WAS movq BORINGSSL_bcm_text_hash@GOTPCREL(%rip), %r11
+	leaq	.LBORINGSSL_bcm_text_hash_local_target(%rip), %r11
 # WAS movq foobar_bss_get@GOTPCREL(%rip), %r11
 	leaq	foobar_bss_get(%rip), %r11
 
@@ -259,6 +263,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s b/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
index f464225..b7d16d5 100644
--- a/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-LabelRewrite/out.s
@@ -195,6 +195,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s b/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
index 87c0f47..f067d02 100644
--- a/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-LargeMemory/out.s
@@ -52,6 +52,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-Sections/out.s b/util/fipstools/delocate/testdata/x86_64-Sections/out.s
index 2fec054..679cab2 100644
--- a/util/fipstools/delocate/testdata/x86_64-Sections/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-Sections/out.s
@@ -52,6 +52,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea
diff --git a/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s b/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
index 759a8c6..65801be 100644
--- a/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-ThreeArg/out.s
@@ -39,6 +39,7 @@
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash:
+.LBORINGSSL_bcm_text_hash_local_target:
 .byte 0xae
 .byte 0x2c
 .byte 0xea