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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 2377CC433EF for ; Wed, 15 Jun 2022 13:25:02 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1B53E8452F; Wed, 15 Jun 2022 15:22:21 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=monstr.eu 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=monstr-eu.20210112.gappssmtp.com header.i=@monstr-eu.20210112.gappssmtp.com header.b="hzL4cOdE"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 1B3EF844F1; Wed, 15 Jun 2022 15:22:00 +0200 (CEST) Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) (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 9147B844F5 for ; Wed, 15 Jun 2022 15:21:57 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=monstr.eu Authentication-Results: phobos.denx.de; spf=none smtp.mailfrom=monstr@monstr.eu Received: by mail-ej1-x62f.google.com with SMTP id fu3so23184579ejc.7 for ; Wed, 15 Jun 2022 06:21:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monstr-eu.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Fp9V38kz98OjcC1GXo89dugvB3KGTIHmNym+7MbPd+I=; b=hzL4cOdENeneQLm/RAU/LBkR7wdiH3DgDrtSqipk6Idjgcahx82mCm7r6QbbczAyB3 RcZt+Cd71dPspcuD8YtAN70VmpAGY5lczxoIsjl0c52wch60vXSpMBM1q4UUTYtHf/CZ EWaYMmYbtyUMfw26PCrGb3zQitf437IM2FTbKJRtq63ba+br2Zd4VjijjPgt1KjuAppP ifeVvCjU6oq0TYmdWCvHjbVk9DYBGFIbJjz3cpTJNmK5w52dHIgxNdr2PCW58Xr/GNdS iIvzljLfqUshOOTLYV7PYIeCAB4+5f9O0W459hj1Z41DrvsB3fRk9vBjdSs/VFvZWayV HDaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Fp9V38kz98OjcC1GXo89dugvB3KGTIHmNym+7MbPd+I=; b=G8vGJ8Gf0aWJ+ZmwQDNJnk/femaajF18+Llz875tCc9T0qat8qf01dgiq2zHWtf+Jo iRiCeNiJ1dNNwi6vzYITqHvFHOoS1ILDKv3BkLA9nCEsmOHhTbARG+UAUWwmpScQ3oo+ HlLBLIiy+gj/vJU62oBCcTnheogPt5bft0IkV/EZ10BrJB5v6l6VMrVd1GF5WKz4cvL/ Fq8l8+cR5phnT9uQFdLAUGdsW0myjcDMP0qgoetLpp3fGvCyISHgEUuf6oX8JLPzsf+P DTB7ZklrUB1LESaMH1FDfHWjn1AJni5Qp5W3HaPJ8Hf68phhtIIA6yvJpLLEVpE/aoQ8 voeg== X-Gm-Message-State: AOAM530vZPvfll1QHKYcTk9peELsa7AQSo0Io1jZ3H4uEAwrnGOxcVgB AVwa1dYPuDLHh37b/CM3C/9+hRtQ8PqeTA== X-Google-Smtp-Source: ABdhPJxf+3EK3zCuui5m4zkBIcKTCBFLX1YQtTU3qN0oZHOJ2rnDKjG7q664givNH72pUrCp1bMgqQ== X-Received: by 2002:a17:907:6d9b:b0:711:d26b:f5ba with SMTP id sb27-20020a1709076d9b00b00711d26bf5bamr8758280ejc.135.1655299316945; Wed, 15 Jun 2022 06:21:56 -0700 (PDT) Received: from localhost ([2a02:768:2307:40d6::f9e]) by smtp.gmail.com with ESMTPSA id j3-20020a170906278300b0070587f81bcfsm6421600ejc.19.2022.06.15.06.21.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jun 2022 06:21:56 -0700 (PDT) From: Michal Simek X-Google-Original-From: Michal Simek To: u-boot@lists.denx.de, git@xilinx.com Cc: Alistair Delva Subject: [PATCH v4 19/23] tools: relocate-rela: Extract elf64 reloc to special function Date: Wed, 15 Jun 2022 15:21:15 +0200 Message-Id: <21763b80527521c85ca7d4ac64ad6ff4885409c8.1655299267.git.michal.simek@amd.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 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.5 at phobos.denx.de X-Virus-Status: Clean Adding support for new type requires to change code layout that's why move elf64 code to own function for easier maintenance. It also solves the problem with not calling fclose in case of error. Return value from rela_elf64 is saved to variable that's why fclose() is called all the time. Signed-off-by: Michal Simek --- (no changes since v1) tools/relocate-rela.c | 96 ++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/tools/relocate-rela.c b/tools/relocate-rela.c index 36065edb3f01..e62247d51e2a 100644 --- a/tools/relocate-rela.c +++ b/tools/relocate-rela.c @@ -216,49 +216,9 @@ static int decode_elf(char **argv) return 1; } -int main(int argc, char **argv) +static int rela_elf64(char **argv, FILE *f) { - FILE *f; - int i, num, ret; - uint64_t file_size; - - if (argc != 3) { - fprintf(stderr, "Statically apply ELF rela relocations\n"); - fprintf(stderr, "Usage: %s \n", - argv[0]); - return 1; - } - - ret = decode_elf(argv); - if (ret) { - fprintf(stderr, "ELF decoding failed\n"); - return ret; - } - - if (rela_start > rela_end || rela_start < text_base) { - fprintf(stderr, "%s: bad rela bounds\n", argv[0]); - return 3; - } - - rela_start -= text_base; - rela_end -= text_base; - - f = fopen(argv[1], "r+b"); - if (!f) { - fprintf(stderr, "%s: Cannot open %s: %s\n", - argv[0], argv[1], strerror(errno)); - return 2; - } - - 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; - } + int i, num; if ((rela_end - rela_start) % sizeof(Elf64_Rela)) { fprintf(stderr, "%s: rela size isn't a multiple of Elf64_Rela\n", argv[0]); @@ -316,11 +276,61 @@ int main(int argc, char **argv) } } + return 0; +} + +int main(int argc, char **argv) +{ + FILE *f; + int ret; + uint64_t file_size; + + if (argc != 3) { + fprintf(stderr, "Statically apply ELF rela relocations\n"); + fprintf(stderr, "Usage: %s \n", + argv[0]); + return 1; + } + + ret = decode_elf(argv); + if (ret) { + fprintf(stderr, "ELF decoding failed\n"); + return ret; + } + + if (rela_start > rela_end || rela_start < text_base) { + fprintf(stderr, "%s: bad rela bounds\n", argv[0]); + return 3; + } + + rela_start -= text_base; + rela_end -= text_base; + + f = fopen(argv[1], "r+b"); + if (!f) { + fprintf(stderr, "%s: Cannot open %s: %s\n", + argv[0], argv[1], strerror(errno)); + return 2; + } + + 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 (ei_class == 2) + ret = rela_elf64(argv, f); + if (fclose(f) < 0) { fprintf(stderr, "%s: %s: close failed: %s\n", argv[0], argv[1], strerror(errno)); return 4; } - return 0; + return ret; } -- 2.36.1