From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8646A194C96; Mon, 7 Jul 2025 21:29:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751923768; cv=none; b=Ybqp5eoPCVJyrrwUF+d3i6x2IDV9KXD6r0e/ijwJp6vLMzCci8F1InVD1Rsn+zJ8/FOgLbd9xnBKcxPGa2MNo1OKSIizgoROzfWxdRIxJ3A5x/yAuCO4M1QGjiN+xXL/+ua6jfuHISX8u9YxedmtaIVWGl/Ijy8N19PY8CeUiY8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751923768; c=relaxed/simple; bh=knn5ptmuTBEl1zFysuErVCW6CyCCiL4U4AygZpHszko=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=ahyTBk6W2BxpTP68LdaFTPrOfddO52zyTtlNEkK1aI3UBKi/eoEYatVTjbTqm1o5/fZQrnAPRKMUBdVhp89ExvwZIJJfD5U51eRKMFGuWCJK+EJrHYHTDqE6HydRwS03nIAUg9yV579AU9lE+bVt6WSO/G8/miS6S2cVzwPzU38= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 640C11515; Mon, 7 Jul 2025 14:29:13 -0700 (PDT) Received: from [172.27.42.165] (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EA5713F66E; Mon, 7 Jul 2025 14:29:24 -0700 (PDT) Message-ID: <4edecc95-0b6e-4365-bc97-d072bb06d79d@arm.com> Date: Mon, 7 Jul 2025 16:29:21 -0500 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] scripts: add zboot support to extract-vmlinux To: Masahiro Yamada Cc: linux-kbuild@vger.kernel.org, nathan@kernel.org, nicolas.schier@linux.dev, linux-kernel@vger.kernel.org, Ard Biesheuvel References: <20250522172941.1669424-1-jeremy.linton@arm.com> <14f2329f-e110-4f3f-976b-acb38d255798@arm.com> Content-Language: en-US From: Jeremy Linton In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, Thanks for looking at this. On 6/24/25 12:56 PM, Masahiro Yamada wrote: > On Tue, Jun 17, 2025 at 1:09 AM Jeremy Linton wrote: >> >> Hi, >> >> Thanks for looking at this. >> >> On 6/7/25 11:04 AM, Masahiro Yamada wrote: >>> On Fri, May 23, 2025 at 2:29 AM Jeremy Linton wrote: >>>> >>>> Zboot compressed kernel images are used for arm kernels on various >>>> distros. >>> >>> Are you talking about arm 32 bit here? >>> (arch/arm/boot/zImage) >> >> No, it should be arm64. >> >>> >>>> extract-vmlinux fails with those kernels because the wrapped image is >>>> another PE. While this could be a bit confusing, the tools primary >>>> purpose of unwrapping and decompressing the contained vmlinux image >>>> makes it the obvious place for this functionality. >>>> >>>> Add a 'file' check in check_vmlinux() that detects a contained PE >>>> image before trying readelf. Recent file implementations output >>>> something like: >>>> >>>> "Linux kernel ARM64 boot executable Image, little-endian, 4K pages" >>> >>> Are you talking about arm64 here? >>> >>> I am confused, as arm64 adopts a simple-compressed image. >> >> No, there is a CONFIG_EFI_ZBOOT, which is a EFI/PE image which self >> decompresses a contained kernel similar to x86, but is for !x86 EFI >> architectures. This patch extends this utility to work for those images >> as well. > > The commit description does not explain why this is useful. > > Extracing vmlinux ELF is useful for debugging purposes. Right, > > In this case, the extracted file is > arch/arm64/boot/vmlinux.bin, which is just a (zero-padded) binary. $ file vmlinux.bin vmlinux.bin: Linux kernel ARM64 boot executable Image, little-endian, 4K pages $ readpe -S vmlinux.bin Sections Section Name: .text Virtual Size: 0x2860000 (42336256 bytes) Virtual Address: 0x10000 Size Of Raw Data: 0x2860000 (42336256 bytes) Pointer To Raw Data: 0x10000 Number Of Relocations: 0 Characteristics: 0x60000020 Characteristic Names IMAGE_SCN_CNT_CODE IMAGE_SCN_MEM_EXECUTE ...(trimming remainder of output) Its another complete PE boot image which can be used by UEFI/grub/etc as well as any PE debugging and analysis utilities. So, this change effectively removes the zboot wrapper. The resulting image is still useful for a certain amount of debugging (ex string extraction, manually matching crash points, version checking, etc) in a distro based environment where the user doesn't have a kernel build tree handy. As well as any boot debugging, which could be caused by the ZBOOT wrapper itself, and I'm sure a long list of other things. Thanks >>> >>> Apparently, this patch did not work for me. >>> >>> $ ./scripts/extract-vmlinux arch/arm/boot/zImage >>> extract-vmlinux: Cannot find vmlinux. >>> >>> The 'file' command says, it is "data". >>> Is my 'file' command too old? >>> >>> $ file arch/arm/boot/Image >>> arch/arm/boot/Image: data >>> >>> >>>> Which is also a stronger statement than readelf provides so drop that >>>> part of the comment. At the same time this means that kernel images >>>> which don't appear to contain a compressed image will be returned >>>> rather than reporting an error. Which matches the behavior for >>>> existing ELF files. >>>> >>>> Signed-off-by: Jeremy Linton >>>> Cc: Ard Biesheuvel >>>> --- >>>> scripts/extract-vmlinux | 9 +++++---- >>>> 1 file changed, 5 insertions(+), 4 deletions(-) >>>> >>>> diff --git a/scripts/extract-vmlinux b/scripts/extract-vmlinux >>>> index 8995cd304e6e..edda1abe226c 100755 >>>> --- a/scripts/extract-vmlinux >>>> +++ b/scripts/extract-vmlinux >>>> @@ -12,10 +12,11 @@ >>>> >>>> check_vmlinux() >>>> { >>>> - # Use readelf to check if it's a valid ELF >>>> - # TODO: find a better to way to check that it's really vmlinux >>>> - # and not just an elf >>>> - readelf -h $1 > /dev/null 2>&1 || return 1 >>>> + file $1 |grep 'Linux kernel.*boot executable Image' > /dev/null >>>> + if [ "$?" -ne "0" ]; then >>>> + # Use readelf to check if it's a valid ELF, if 'file' fails >>>> + readelf -h $1 > /dev/null 2>&1 || return 1 >>>> + fi >>>> >>>> cat $1 >>>> exit 0 >>>> -- >>>> 2.49.0 >>>> >>> >>> >> >> > >