From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC674C433EF for ; Wed, 20 Oct 2021 21:40:51 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 337A3610E6 for ; Wed, 20 Oct 2021 21:40:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 337A3610E6 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 52D4283423; Wed, 20 Oct 2021 23:40:18 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="CP5Cxu23"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3CAFB83405; Wed, 20 Oct 2021 23:31:50 +0200 (CEST) Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 91ED7833E3 for ; Wed, 20 Oct 2021 23:31:43 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=3vYpwYQYKBqYGJKRbGMUUMRK.IUSa-HUUZROYZY.JKTd.JK@flex--adelva.bounces.google.com Received: by mail-pj1-x104a.google.com with SMTP id f6-20020a17090a654600b0019e585e8f6fso1006145pjs.9 for ; Wed, 20 Oct 2021 14:31:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=llVe01vELc1lxbuwGYTaDR2t6JYqzvWkHko4ROMWS7o=; b=CP5Cxu2374X21Op5nCHduP9aQj9AaOps61Dc6ovmkmY4X5QlXi5Xk9lAQB8ZvH7Ez1 /wRJgvhHTTBWpc32I/nsLZv0EBD1aME0KAqn0maHC3uIG4imUsl0wGZMmbgP8yVnFfSf ot1mkzxS57DIbRoVuugj4spdDHFlaCq0/z0vc2Y3J903snsAWoY/04rDdRgsbYZjPU36 gHy3DGssDfd9jK8S5XIzSqt9juyP7roKrzgNYK+M7SXBF+qeZnZEkByS6hGtUELpzQmV isAqtkRQpAFVPZZ2uedOQoi+2yFxExY4n0sq3/NvPGMysPiIj7/WqqRIXuSiBwY5R2ig ekyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=llVe01vELc1lxbuwGYTaDR2t6JYqzvWkHko4ROMWS7o=; b=aq/9JEEHeZ4CQyDfB+hyynl/uGc4qxgvhI8tHHEV+kXwjerIIsakIvuYen4wm4iQez l5dYgYsCeWBc5J2UsSAdXlMyTCl/K0INrPlJEbT+PG48fzEGne4c/wPKOhiGNcFsCwHG Nu3aVK5YXpT/IxPbLN5Vqkj9oMCZUwqs7gBHmwt/yCqhCPwzBOgKzqWDJLbBpbc87ou5 KcAZ8Xc1lKPtND5OCbV9R8S0T0KVkM4bF/LinCL+Tzi0oaGeNyfeXmm94msWtQLiPjSg aJVggeND0iR5T+OabipgOST124pUXtKtxAvs7g/aZzHPNxKDmoDQi4BmCRpIY0W7z68A ePrQ== X-Gm-Message-State: AOAM530e+eFQp/hJYQGzjH75nAJdP2gS3cuJ0krgdunfSwUZK7KW6W2w cTkk0pY/ok3OWn07egOgXI+E5rWekrIcjjuUTBr3BsLWj7bhr6MN+3XHJci0JpuhCJnOs2re7xJ tyaWds5gDMbbLqyb2RrcKPtb2KKyvbW5YBQzZmZhKi9Ma+S8/rnoa/XtsaJs= X-Google-Smtp-Source: ABdhPJzP+pA45NKorqC5mFtoIELgwoVvSRIMkJuqmLB14YZiafgH6OiWFxHgnryh4cOYQYmLUb5sfx90i28= X-Received: from adelva.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:b2b]) (user=adelva job=sendgmr) by 2002:a17:90b:4a88:: with SMTP id lp8mr1704388pjb.226.1634765501922; Wed, 20 Oct 2021 14:31:41 -0700 (PDT) Date: Wed, 20 Oct 2021 21:31:32 +0000 In-Reply-To: <20211020213134.7534-1-adelva@google.com> Message-Id: <20211020213134.7534-4-adelva@google.com> Mime-Version: 1.0 References: <20211020213134.7534-1-adelva@google.com> X-Mailer: git-send-email 2.33.0.1079.g6e70778dc9-goog Subject: [PATCH] arm64: relocate-rela: Add support for ld.lld From: Alistair Delva To: u-boot@lists.denx.de Cc: David Brazdil , Scott Wood , Tom Rini Content-Type: text/plain; charset="UTF-8" X-Mailman-Approved-At: Wed, 20 Oct 2021 23:39:55 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Cap end of relocations by the binary size. Linkers like to insert some auxiliary sections between .rela.dyn and .bss_start. These sections don't make their way to the final binary, but reloc_rela still tries to relocate them, resulting in attempted read past the end of file. When linking U-Boot with ld.lld, the STATIC_RELA feature (enabled by default on arm64) breaks the build. After this patch, U-Boot can be linked successfully with and without CONFIG_STATIC_RELA. Originally-from: Elena Petrova Signed-off-by: Alistair Delva Cc: David Brazdil Cc: Scott Wood Cc: Tom Rini --- tools/relocate-rela.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tools/relocate-rela.c b/tools/relocate-rela.c index 6a524014b7..f0bc548617 100644 --- a/tools/relocate-rela.c +++ b/tools/relocate-rela.c @@ -63,7 +63,7 @@ int main(int argc, char **argv) { FILE *f; int i, num; - uint64_t rela_start, rela_end, text_base; + uint64_t rela_start, rela_end, text_base, file_size; if (argc != 5) { fprintf(stderr, "Statically apply ELF rela relocations\n"); @@ -87,8 +87,7 @@ int main(int argc, char **argv) return 3; } - if (rela_start > rela_end || rela_start < text_base || - (rela_end - rela_start) % sizeof(Elf64_Rela)) { + if (rela_start > rela_end || rela_start < text_base) { fprintf(stderr, "%s: bad rela bounds\n", argv[0]); return 3; } @@ -96,6 +95,21 @@ int main(int argc, char **argv) rela_start -= text_base; rela_end -= text_base; + fseek(f, 0, SEEK_END); + file_size = ftell(f); + rewind(f); + + if (rela_end > file_size) { + // Most likely compiler inserted some section that didn't get + // objcopy-ed into the final binary + rela_end = file_size; + } + + if ((rela_end - rela_start) % sizeof(Elf64_Rela)) { + fprintf(stderr, "%s: rela size isn't a multiple of Elf64_Rela\n", argv[0]); + return 3; + } + num = (rela_end - rela_start) / sizeof(Elf64_Rela); for (i = 0; i < num; i++) { -- 2.30.2