From patchwork Fri Mar 8 21:57:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 1909878 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=golang-org.20230601.gappssmtp.com header.i=@golang-org.20230601.gappssmtp.com header.a=rsa-sha256 header.s=20230601 header.b=xHAQW7nJ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Ts0Qw6Lyhz1yWx for ; Sat, 9 Mar 2024 08:57:59 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C872E385E000 for ; Fri, 8 Mar 2024 21:57:55 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-yb1-xb2c.google.com (mail-yb1-xb2c.google.com [IPv6:2607:f8b0:4864:20::b2c]) by sourceware.org (Postfix) with ESMTPS id A45703858D33 for ; Fri, 8 Mar 2024 21:57:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A45703858D33 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=golang.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=golang.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A45703858D33 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::b2c ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709935056; cv=none; b=LtVTHjpiI6EBNOfci9IjoTXjAlqYQe/6UdU++iU8gG2of54LaxG5ekRoMUAjxN5LvfwCx7PaE9716gDkNn5eEAJ93aDn8o5L7wPJR0T9RNZFxe8IuGNTwFOkeyWaky5c+oMgHI/0WPJCa7SKN8QhIxZ6OqxkBdJ//uMXbOpA4Kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709935056; c=relaxed/simple; bh=kOLr72mmDeDz+vcw7glU4wyJDGZml+xOco1z719Wk6w=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=JkwHZs4f+zTtu76iuxv6hsSiMWmgr8VRnbDLD6JAuqz20i/sIgBOtMoNhF0uzmiqYssZsDoKUaBLEXLeAZad5ZdZUuo3BMUK1hP8CY4/gYl4uEoqOCGa+gsaV+HS77BFLJPKn2scl8jV3IVlX2l91YLVZ67oX/mEHnDp/EIYTLA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-yb1-xb2c.google.com with SMTP id 3f1490d57ef6-dbed0710c74so1263623276.1 for ; Fri, 08 Mar 2024 13:57:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=golang-org.20230601.gappssmtp.com; s=20230601; t=1709935054; x=1710539854; darn=gcc.gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=kJp4x23Kaklv3uWKCVlYOrO8TNe884+jxwSNncWgw0k=; b=xHAQW7nJRMOHH8ENScnlMMm0tGsX3yRInpZUzncn19Uzhdhhia87rpv9yRfs68P5br Xv3CaFBZiOw656jDhJpDVqEWa7VgUjLbJExWpVip+u2PIfA4WpeoklhrA3DFJWChHAQQ VN2Ri2Qt6QTWDnzWHWQNbXG9dPAa/cs1UuGe63SiNzKeGmiCadKqr1IGutVdO9XL+F6D X16dixgrPCcjHll9UV0rPBTx8+bd/UB7Pzre6VROs1/DIIHNxyPzdJU5ev0T5Y6x1kn9 v/F8ssvRbt+hFjR2okw4JajsDhRHc/gyOPC+H7ek34YViACVs+M2ti7doUOMaEaE8ty4 ftRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709935054; x=1710539854; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=kJp4x23Kaklv3uWKCVlYOrO8TNe884+jxwSNncWgw0k=; b=Va8h8xR1+3v2zEyXImBH/8QJa/cVIaG9Y3v1wO8v369hqvKKyx9AiNWLSeKlkX7AAX NGv49rllnWL63Ly9QrUtN4ZKcy02K1U3pgzfKlCfPcH0wWAYOnXZCxksLIUSaxKc66JF 7eLBcYhO87wk/KJFLzKr9wdhCyzu95S1z/ywUvzUW4lCbKXSFQrDH20lwRhPwUEXccwg qzWPCazuNqHNLAmABJUyPCndY3Xo6+Ic2+mFXaoLwhhS5fMDqM/mFb3eRDZ/MrZnU3+F +DZdlIA864fZuW1JF7Cr48lg0wESLRhPq+t0w7/3GbDTR8ZeVFGSC4T4I/SeQ6NLX5tQ ElWQ== X-Gm-Message-State: AOJu0YzqVRiSKWP2tFGGYCOur5uXsYzxZev3VSvKcvZjICWVuJ5jnRMS x1jA4ZAH06QtXMzt0Ro1KwNEPdP1WVatIrq24JUPGEQqBGCWad81JvMzMi0uAg6w69DqPWS+YAm NQfhg5vB3XIZxmxkBMLfVivrl5pFzUAoKib/yn8kxr5273JAz4qM= X-Google-Smtp-Source: AGHT+IFRgV3Vqj3N9Jg8YiDYwYj5kwRHrliWdpMSmhexdMy/7HAqhl0ws4OXuWMBNvsVbcIyALnAnd9ik+fvQULmdl8= X-Received: by 2002:a25:86d2:0:b0:dc7:4b0a:589 with SMTP id y18-20020a2586d2000000b00dc74b0a0589mr266661ybm.55.1709935053710; Fri, 08 Mar 2024 13:57:33 -0800 (PST) MIME-Version: 1.0 From: Ian Lance Taylor Date: Fri, 8 Mar 2024 13:57:22 -0800 Message-ID: Subject: libbacktrace patch committed: Don't assume compressed section aligned To: gcc-patches X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Reportedly when lld compresses debug sections, it fails to set the alignment of the compressed section such that the compressed header can be read directly. To me this seems like a bug in lld. However, libbacktrace needs to work around it. This patch, originally by the GitHub user ubyte, does that. Bootstrapped and tested on x86_64-pc-linux-gnu. Committed to mainline. Ian * elf.c (elf_uncompress_chdr): Don't assume compressed section is aligned. 5825bd0e0d0040126e78269e56c9b9f533e2a520 diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c index 7841c86cd9c..3cd87020b03 100644 --- a/libbacktrace/elf.c +++ b/libbacktrace/elf.c @@ -5076,7 +5076,7 @@ elf_uncompress_chdr (struct backtrace_state *state, backtrace_error_callback error_callback, void *data, unsigned char **uncompressed, size_t *uncompressed_size) { - const b_elf_chdr *chdr; + b_elf_chdr chdr; char *alc; size_t alc_len; unsigned char *po; @@ -5088,27 +5088,30 @@ elf_uncompress_chdr (struct backtrace_state *state, if (compressed_size < sizeof (b_elf_chdr)) return 1; - chdr = (const b_elf_chdr *) compressed; + /* The lld linker can misalign a compressed section, so we can't safely read + the fields directly as we can for other ELF sections. See + https://github.com/ianlancetaylor/libbacktrace/pull/120. */ + memcpy (&chdr, compressed, sizeof (b_elf_chdr)); alc = NULL; alc_len = 0; - if (*uncompressed != NULL && *uncompressed_size >= chdr->ch_size) + if (*uncompressed != NULL && *uncompressed_size >= chdr.ch_size) po = *uncompressed; else { - alc_len = chdr->ch_size; + alc_len = chdr.ch_size; alc = backtrace_alloc (state, alc_len, error_callback, data); if (alc == NULL) return 0; po = (unsigned char *) alc; } - switch (chdr->ch_type) + switch (chdr.ch_type) { case ELFCOMPRESS_ZLIB: if (!elf_zlib_inflate_and_verify (compressed + sizeof (b_elf_chdr), compressed_size - sizeof (b_elf_chdr), - zdebug_table, po, chdr->ch_size)) + zdebug_table, po, chdr.ch_size)) goto skip; break; @@ -5116,7 +5119,7 @@ elf_uncompress_chdr (struct backtrace_state *state, if (!elf_zstd_decompress (compressed + sizeof (b_elf_chdr), compressed_size - sizeof (b_elf_chdr), (unsigned char *)zdebug_table, po, - chdr->ch_size)) + chdr.ch_size)) goto skip; break; @@ -5126,7 +5129,7 @@ elf_uncompress_chdr (struct backtrace_state *state, } *uncompressed = po; - *uncompressed_size = chdr->ch_size; + *uncompressed_size = chdr.ch_size; return 1; @@ -6876,8 +6879,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, } } - // A debuginfo file may not have a useful .opd section, but we can use the - // one from the original executable. + /* A debuginfo file may not have a useful .opd section, but we can use the + one from the original executable. */ if (opd == NULL) opd = caller_opd;