From e1458aaded8e34b0c74c1a17ac1dc3765d97c082 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Mon, 18 Jul 2016 12:19:34 +0200 Subject: ArmPkg: add prebuilt glue binaries for GCC5 LTO support GCC in LTO mode interoperates poorly with non-standard libraries that provide implementations of compiler intrinsics such as memcpy/memset or the stack protector entry points. Such libraries need to be built in non-LTO mode, and then referenced explicitly on the linker command line using a -plugin-opt=-pass-through=-lxxx linker option. However, if these intrinsics are also referenced directly, the LTO version of the code will be pulled in, and will happily satisfy all other references to the same symbol. So add a pair of glue libraries, for ARM and AARCH64, that reference the known intrinsics. Since the binaries live under ArmPkg directly, we can reference them in tools_def.txt. Under LD garbage collection, the object itself will be pruned, and so will the intrinsics that end up unused by the module. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Acked-by: Jordan Justen Reviewed-by: Leif Lindholm --- ArmPkg/Library/GccLto/liblto-aarch64.a | Bin 0 -> 1016 bytes ArmPkg/Library/GccLto/liblto-aarch64.s | 27 +++++++++++++++ ArmPkg/Library/GccLto/liblto-arm.a | Bin 0 -> 2096 bytes ArmPkg/Library/GccLto/liblto-arm.s | 61 +++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 ArmPkg/Library/GccLto/liblto-aarch64.a create mode 100644 ArmPkg/Library/GccLto/liblto-aarch64.s create mode 100644 ArmPkg/Library/GccLto/liblto-arm.a create mode 100644 ArmPkg/Library/GccLto/liblto-arm.s (limited to 'ArmPkg') diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.a b/ArmPkg/Library/GccLto/liblto-aarch64.a new file mode 100644 index 0000000000..2ab00238f0 Binary files /dev/null and b/ArmPkg/Library/GccLto/liblto-aarch64.a differ diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.s b/ArmPkg/Library/GccLto/liblto-aarch64.s new file mode 100644 index 0000000000..45000d3277 --- /dev/null +++ b/ArmPkg/Library/GccLto/liblto-aarch64.s @@ -0,0 +1,27 @@ +// +// Copyright (c) 2016, Linaro Ltd. All rights reserved.
+// +// This program and the accompanying materials are licensed and made available under +// the terms and conditions of the BSD License that accompanies this distribution. +// The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php. +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// + +// +// GCC in LTO mode interoperates poorly with non-standard libraries that +// provide implementations of compiler intrinsics such as memcpy/memset +// or the stack protector entry points. +// +// By referencing these functions from a non-LTO object that can be passed +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the +// intrinsics are included in the link in a way that allows them to be +// pruned again if no other references to them exist. +// + + .long memcpy - . + .long memset - . + .long __stack_chk_fail - . + .long __stack_chk_guard - . diff --git a/ArmPkg/Library/GccLto/liblto-arm.a b/ArmPkg/Library/GccLto/liblto-arm.a new file mode 100644 index 0000000000..d811c09573 Binary files /dev/null and b/ArmPkg/Library/GccLto/liblto-arm.a differ diff --git a/ArmPkg/Library/GccLto/liblto-arm.s b/ArmPkg/Library/GccLto/liblto-arm.s new file mode 100644 index 0000000000..bc16320a46 --- /dev/null +++ b/ArmPkg/Library/GccLto/liblto-arm.s @@ -0,0 +1,61 @@ +// +// Copyright (c) 2016, Linaro Ltd. All rights reserved.
+// +// This program and the accompanying materials are licensed and made available under +// the terms and conditions of the BSD License that accompanies this distribution. +// The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php. +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// + +// +// GCC in LTO mode interoperates poorly with non-standard libraries that +// provide implementations of compiler intrinsics such as memcpy/memset +// or the stack protector entry points. +// +// By referencing these functions from a non-LTO object that can be passed +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the +// intrinsics are included in the link in a way that allows them to be +// pruned again if no other references to them exist. +// + + .long memcpy - . + .long memset - . + .long __stack_chk_fail - . + .long __stack_chk_guard - . + .long __ashrdi3 - . + .long __ashldi3 - . + .long __aeabi_idiv - . + .long __aeabi_idivmod - . + .long __aeabi_uidiv - . + .long __aeabi_uidivmod - . + .long __divdi3 - . + .long __divsi3 - . + .long __lshrdi3 - . + .long __aeabi_memcpy - . + .long __aeabi_memset - . + .long memmove - . + .long __modsi3 - . + .long __moddi3 - . + .long __muldi3 - . + .long __aeabi_lmul - . + .long __ARM_ll_mullu - . + .long __udivsi3 - . + .long __umodsi3 - . + .long __udivdi3 - . + .long __umoddi3 - . + .long __udivmoddi4 - . + .long __clzsi2 - . + .long __ctzsi2 - . + .long __ucmpdi2 - . + .long __switch8 - . + .long __switchu8 - . + .long __switch16 - . + .long __switch32 - . + .long __aeabi_ulcmp - . + .long __aeabi_uldivmod - . + .long __aeabi_ldivmod - . + .long __aeabi_llsr - . + .long __aeabi_llsl - . -- cgit v1.2.3