summaryrefslogtreecommitdiff
path: root/gbl/efi/arch/x86/deps.S
diff options
context:
space:
mode:
authorYecheng Zhao <zyecheng@google.com>2024-04-26 00:05:29 +0000
committerYecheng Zhao <zyecheng@google.com>2024-04-26 02:28:53 +0000
commit3b27c6f519f4ca5a96466129046397d1f79574f8 (patch)
tree36bd2e19863467b8e963904673f32643f1fdb87a /gbl/efi/arch/x86/deps.S
parent57d214e02106f0efe7f97b1f135cb5ae863721b3 (diff)
downloadlibbootloader-3b27c6f519f4ca5a96466129046397d1f79574f8.tar.gz
Fix build error due to chkstk/alloca on x86
The `avb_cert_validate_vbmeta_public_key` API uses more than 8KB of stack memory and triggers the compiler to insert calls to function __chkstk() and __alloca() on x86/x86_64 platforms. Although rust libcompiler_builtins does provide the implementations, there are two issues: 1. LLVM mangles the symbol and add an additional underscore to the symbol name, causing link to fail to find the correct one. 2. The implementation is not enabled for x86 uefi build. x86_64 had the same issue but was fixed. But it wasn't ported to x86. As a workaround, for #1 we define mangled symbols that simply jump to the correct one. For #2 we apply the same fix from x86_64 for x86 at build time to and rebuild std from source, until upstream is fixed. Bug: 337114254 Change-Id: Id7bce71a7d5ca08fc79180733e40fc1ec083da57
Diffstat (limited to 'gbl/efi/arch/x86/deps.S')
-rw-r--r--gbl/efi/arch/x86/deps.S31
1 files changed, 31 insertions, 0 deletions
diff --git a/gbl/efi/arch/x86/deps.S b/gbl/efi/arch/x86/deps.S
new file mode 100644
index 0000000..9107919
--- /dev/null
+++ b/gbl/efi/arch/x86/deps.S
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * LLVM mangles the "___chkstk()" and "__alloca()" function from rust
+ * libcompiler_builtins with an additional underscore, making them "___chkstk"
+ * and "___alloca and causing the linker to fail finding them. We workaround by
+ * defining the magled symbols that simply jump to the correct target.
+ */
+
+.global ___chkstk
+.global __alloca
+
+___chkstk:
+ jmp ____chkstk
+
+__alloca:
+ jmp ___alloca