From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::441; helo=mail-wr1-x441.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A09AE21198CB3 for ; Tue, 11 Dec 2018 04:19:47 -0800 (PST) Received: by mail-wr1-x441.google.com with SMTP id p4so13846996wrt.7 for ; Tue, 11 Dec 2018 04:19:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BlVIB8IQ8RtEYCzz0gg/fNM76dC0zWlxst2hWaf7L+I=; b=P3cqQTh04PGw+WUSOTXOaJxe33x834ROPLPuDMrTHldZOdSFHRkf6vRL571bF0jqR4 RucvlmS5DcZJNJx8BRdV3eLW9/P9fwl5Fd4NATWnJB5P9qAnMU9WTOzO+77dX1qRAc7q CGGd95paaQhLeRbO/cfOhMD+loFLxP8FuUmE0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BlVIB8IQ8RtEYCzz0gg/fNM76dC0zWlxst2hWaf7L+I=; b=juW0XzMAgWSWmtkn0MIAyttNaAlNW5KgoOB0iDGLZZqsB36xr2qQ797aMKNCNBP0zR iGveBwVedzm/X0xmqOfD6kQ7Navdg+csHm+3JBh34qMmo8JKg8bil/3DXviW5BZk4bUP mQk8WhrMpLPleybeJGkPJJ3PRH+XNWoyMHn9F5VCOuqDKfKN6HF2jCzIUuNsulr5hpsd g89188HkJVYjltpBM4fSFf/OHEzuF65eziTZkmskanoMFhe0il5ZGfslI089Cj0/eYRi k3voPusaXRKKEicFs2DYJIkBUIQZsV2GiKCcMg5UMe07NH/6nTwzyabLoRFGkC4LD/b+ o7VA== X-Gm-Message-State: AA+aEWZytaYQ2CX5e6FJFLiMHgeEaqflCl3R+5pV7IgzlRP6aneNKOmo hG/jCvRrsZc9wZdQ5BCP/Kw/oJJWrZfQmA== X-Google-Smtp-Source: AFSGD/WWDMtSbwM5x/il4wA3tHslTEcRwRLfHAiTO547t2o9dvmvID66qE5rjnvOiWCsk3XDRjv6QQ== X-Received: by 2002:adf:e5c4:: with SMTP id a4mr12466051wrn.157.1544530785470; Tue, 11 Dec 2018 04:19:45 -0800 (PST) Received: from harold.home ([2a01:cb1d:112:6f00:8c3:6b9d:cbc9:58c6]) by smtp.gmail.com with ESMTPSA id n9sm14183017wrx.80.2018.12.11.04.19.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Dec 2018 04:19:44 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Cc: lersek@redhat.com, leif.lindholm@linaro.org, philmd@redhat.com, Ard Biesheuvel Date: Tue, 11 Dec 2018 13:19:36 +0100 Message-Id: <20181211121936.3599-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181211121936.3599-1-ard.biesheuvel@linaro.org> References: <20181211121936.3599-1-ard.biesheuvel@linaro.org> MIME-Version: 1.0 Subject: [PATCH 2/2] ArmVirtPkg/PrePiUniCoreRelocatable CLANG38: work around build issues X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Dec 2018 12:19:48 -0000 Content-Transfer-Encoding: 8bit The self-relocating PrePi module that is used by the ArmVirtQemuKernel and ArmVirtXen targets runs the linker in PIE mode so that it emits dynamic relocations into the final image in a way that permits the module to relocate itself into place before calling into the C code. When building these targets using the CLANG38 toolchain, we switch from the BFD to the GOLD linker, which behaves a bit differently when building PIE executables, and insists on emitting GOT indirected symbol references throughout, which means a) that we end up with absolute addresses (which need to be fixed up at load time) for no good reason, and b) we have to add support for handling GOT entries to GenFw if we want to convert them into PE/COFF. So instead, let's emit a shared library. Since the ELF image only serves as the input to GenFw, this does not lead to any loss of functionality, although it does require the -Bsymbolic linker option to be added to ensure that no symbol based dynamic relocations are emitted (which would, e.g., permit lazy binding for shared libraries). So for all other toolchains, the linker option changes are a no-op. Then, we have to convince CLANG38/GOLD that there is no need to refer to symbols via a GOT entry. This is done by forcing hidden visibility for all symbols in all components that make up the PrePi SEC module: this informs the linker that a symbol is never exported or preempted, making it safe to refer to it directly from anywhere in the code, rather than indirectly via a GOT entry. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- ArmVirtPkg/ArmVirtQemuKernel.dsc | 12 ++++++++-- ArmVirtPkg/ArmVirtXen.dsc | 12 ++++++++-- ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf | 2 +- ArmVirtPkg/Include/Platform/Hidden.h | 23 ++++++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 9928919bf5b0..c4324a9e264b 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -68,11 +68,19 @@ [LibraryClasses.common] [LibraryClasses.common.UEFI_DRIVER] UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf -[BuildOptions.ARM.EDKII.SEC, BuildOptions.ARM.EDKII.BASE] +[BuildOptions.common.EDKII.SEC, BuildOptions.common.EDKII.BASE] # Avoid MOVT/MOVW instruction pairs in code that may end up in the PIE # executable we build for the relocatable PrePi. They are not runtime # relocatable in ELF. - *_CLANG35_*_CC_FLAGS = -mno-movt + *_CLANG35_ARM_CC_FLAGS = -mno-movt + + # + # CLANG38 with LTO support enabled uses the GNU GOLD linker, which insists + # on emitting GOT based symbol references when running in shared mode, unless + # we override visibility to 'hidden' in all modules that make up the PrePi + # build. + # + GCC:*_CLANG38_*_CC_FLAGS = -include $(WORKSPACE)/ArmVirtPkg/Include/Platform/Hidden.h ################################################################################ # diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index 20fae9e675bb..e083666f54ea 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -57,11 +57,19 @@ [LibraryClasses] [LibraryClasses.common.UEFI_DRIVER] UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf -[BuildOptions.ARM.EDKII.SEC, BuildOptions.ARM.EDKII.BASE] +[BuildOptions.common.EDKII.SEC, BuildOptions.common.EDKII.BASE] # Avoid MOVT/MOVW instruction pairs in code that may end up in the PIE # executable we build for the relocatable PrePi. They are not runtime # relocatable in ELF. - *_CLANG35_*_CC_FLAGS = -mno-movt + *_CLANG35_ARM_CC_FLAGS = -mno-movt + + # + # CLANG38 with LTO support enabled uses the GNU GOLD linker, which insists + # on emitting GOT based symbol references when running in shared mode, unless + # we override visibility to 'hidden' in all modules that make up the PrePi + # build. + # + GCC:*_CLANG38_*_CC_FLAGS = -include $(WORKSPACE)/ArmVirtPkg/Include/Platform/Hidden.h ################################################################################ # diff --git a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf index 034ddb41cb48..5fe6cd8eb481 100755 --- a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf +++ b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf @@ -105,4 +105,4 @@ [Pcd] gArmTokenSpaceGuid.PcdFvBaseAddress [BuildOptions] - GCC:*_*_*_DLINK_FLAGS = -pie -Wl,-T,$(MODULE_DIR)/Scripts/PrePi-PIE.lds + GCC:*_*_*_DLINK_FLAGS = -shared -Wl,-Bsymbolic -Wl,-T,$(MODULE_DIR)/Scripts/PrePi-PIE.lds diff --git a/ArmVirtPkg/Include/Platform/Hidden.h b/ArmVirtPkg/Include/Platform/Hidden.h new file mode 100644 index 000000000000..20e9f5d896b2 --- /dev/null +++ b/ArmVirtPkg/Include/Platform/Hidden.h @@ -0,0 +1,23 @@ +/** @file + + Copyright (c) 2018, Linaro Limited. All rights reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +**/ + +// +// Setting the GCC -fvisibility=hidden command line option is not quite the same +// as setting the pragma below: the former only affects definitions, whereas the +// latter affects extern declarations as well. So if we want to ensure that no +// GOT indirected symbol references are emitted, we need to use the pragma, or +// GOT based cross object references could be emitted, e.g., in libraries, and +// these cannot be relaxed to ordinary symbol references at link time. +// +#pragma GCC visibility push (hidden) -- 2.19.2