[Crash-utility] Can't open i386 vmcore with crash on 2.6.20-rc2kernels
Dave Anderson
anderson at redhat.com
Thu Jan 4 14:35:05 UTC 2007
Vivek Goyal wrote:
> On Wed, Jan 03, 2007 at 09:29:52AM -0500, Dave Anderson wrote:
> > >
> > > WARNING: invalid linux_banner pointer: 756e694c
> > > crash: vmlinux and vmcore do not match!
> > >
> >
> > Hi Vivek,
> >
> > It has to do with how the linux_banner symbol is declared. The crash code
> > in question does this:
> >
> >
> > if (!(sp = symbol_search("linux_banner")))
> > error(FATAL, "linux_banner symbol does not exist?\n");
> > else if (sp->type == 'R')
> > linux_banner = symbol_value("linux_banner");
> > else
> > get_symbol_data("linux_banner", sizeof(ulong), &linux_banner);
> >
> > if (!IS_KVADDR(linux_banner))
> > error(WARNING, "invalid linux_banner pointer: %lx\n",
> > linux_banner);
> >
> > Up until 2.6.20-rc2 (apparently), if the linux_banner symbol
> > was in the readonly section ('R'), the string data was located
> > at the address of the linux_banner symbol. Otherwise, the
> > linux_banner symbol contained the address of the string data.
> >
> > In your kernel, what does "nm -Bn vmlinux | grep linux_banner" show?
> > Maybe 'r' instead of 'R'?
> >
>
> Hi Dave,
>
> You are right. Following is "nm -Bn vmlinux | grep linux_banner" output.
>
> c0411000 r linux_banner
>
> I checked that in 2.6.19, following was definition of linux_banner.
>
> const char linux_banner[] =
> "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
> LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
>
> Symbol table entry for linux_banner:
> c0407000 129 OBJECT GLOBAL DEFAULT 3 linux_banner
>
> But in 2.6.20-rc, it has been made static. Hence scope of this symbol is no
> more global and now it is local, hence 'r' instead of 'R'.
>
> static const char linux_banner[] =
> "Linux version " UTS_RELEASE
> " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
> " (" LINUX_COMPILER ")"
> " " UTS_VERSION "\n";
>
> Symbol table entry for linux_banner:
>
> c0411000 143 OBJECT LOCAL DEFAULT 7 linux_banner
>
> Attached test patch works for me.
>
> Just a thought, can debug info section tell us what is the type of
> linux_banner? I mean something to differentiate between above two cases
> where linux_banner itself is a string or it contains a pointer to string.
>
I suppose so. In the kernels I have checked, the readonly version
is a char[#], as opposed to a char * if it's in the data section. The
reason it's been done as above is because originally the call to
kernel_init() was broken into two parts, one before the gdb session
was initialized, and again afterwards. And the linux_banner check
used to be done in the pre-gdb timeframe.
In any case, your patch should work just fine.
Thanks,
Dave
>
> Thanks
> Vivek
>
> Signed-off-by: Vivek Goyal <vgoyal at in.ibm.com>
> ---
>
> kernel.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff -puN kernel.c~crash-unable-to-read-linux-banner-fix kernel.c
> --- crash-4.0-3.16/kernel.c~crash-unable-to-read-linux-banner-fix 2007-01-04 14:05:23.000000000 +0530
> +++ crash-4.0-3.16-root/kernel.c 2007-01-04 14:07:15.000000000 +0530
> @@ -480,7 +480,7 @@ verify_version(void)
>
> if (!(sp = symbol_search("linux_banner")))
> error(FATAL, "linux_banner symbol does not exist?\n");
> - else if (sp->type == 'R')
> + else if ((sp->type == 'R') || (sp->type == 'r'))
> linux_banner = symbol_value("linux_banner");
> else
> get_symbol_data("linux_banner", sizeof(ulong), &linux_banner);
> _
More information about the Crash-utility
mailing list