Hi,
lijiang <lijiang(a)redhat.com> writes:
On Tue, Mar 29, 2022 at 2:05 PM lijiang <lijiang(a)redhat.com>
wrote:
> On Tue, Mar 29, 2022 at 1:22 PM Alexander Egorenkov <
> egorenar(a)linux.ibm.com> wrote:
>
>> Hi,
>>
>> Lianbo Jiang <lijiang(a)redhat.com> writes:
>>
>> > The commit <cd8954023bd4> broke crash-utility on s390x and got the
>> > following error:
>> >
>> > crash: cannot resolve ".rodata"
>> >
>> > The reason is that all symbols containing a "." may be filtered
out
>> > on s390x. To prevent the current failure, a simple way is to check
>> > whether the symbol ".rodata" exists before calculating the value
of
>> > a symbol.
>> >
>> > Fixes: cd8954023bd4 ("kernel: fix start-up time degradation caused by
>> strings command")
>> > Reported-by: Alexander Egorenkov <egorenar(a)linux.ibm.com>
>> > Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
>> > ---
>> > kernel.c | 3 +++
>> > 1 file changed, 3 insertions(+)
>> >
>> > diff --git a/kernel.c b/kernel.c
>> > index 92434a3ffe2d..b504564846c7 100644
>> > --- a/kernel.c
>> > +++ b/kernel.c
>> > @@ -11790,6 +11790,9 @@ int get_linux_banner_from_vmlinux(char *buf,
>> size_t size)
>> > struct bfd_section *sect;
>> > long offset;
>> >
>> > + if (!symbol_exists(".rodata"))
>> > + return FALSE;
>> > +
>> > sect = bfd_get_section_by_name(st->bfd, ".rodata");
>> > if (!sect)
>> > return FALSE;
>> > --
>> > 2.20.1
>>
>> thanks! This works on s390x.
>>
>
Sorry, my reply was truncated. How about the following changes?
>
>
diff --git a/kernel.c b/kernel.c
> index 92434a3ffe2d..b504564846c7 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -11790,6 +11790,9 @@ int get_linux_banner_from_vmlinux(char *buf,
> size_t size)
> struct bfd_section *sect;
> long offset;
>
> + if (!symbol_exists(".rodata"))
> + return FALSE;
> +
> sect = bfd_get_section_by_name(st->bfd, ".rodata");
> if (!sect)
> return FALSE;
> diff --git a/s390.c b/s390.c
> index 078b1a25724e..42f5cc63ae52 100644
> --- a/s390.c
> +++ b/s390.c
> @@ -442,6 +442,9 @@ s390_verify_symbol(const char *name, ulong value, char
> type)
> if (strstr(name, "L2\002") == name)
> return FALSE;
>
> + if (STREQ(name, ".rodata"))
> + return TRUE;
> +
> /* throw away all symbols containing a '.' */
> for(i = 0; i < strlen(name);i++){
> if(name[i] == '.')
> diff --git a/s390x.c b/s390x.c
> index c07d283d7f52..d7ee3755fc0b 100644
> --- a/s390x.c
> +++ b/s390x.c
> @@ -1087,6 +1087,9 @@ s390x_verify_symbol(const char *name, ulong value,
> char type)
> if (strstr(name, "L2\002") == name)
> return FALSE;
>
> + if (STREQ(name, ".rodata"))
> + return TRUE;
> +
> /* throw away all symbols containing a '.' */
> for(i = 0; i < strlen(name);i++){
> if(name[i] == '.')
>
This Message Is From an External Sender
This message came from outside your organization.
On Tue, Mar 29, 2022 at 2:05 PM lijiang <lijiang(a)redhat.com> wrote:
On Tue, Mar 29, 2022 at 1:22 PM Alexander Egorenkov <egorenar(a)linux.ibm.com>
wrote:
Hi,
Lianbo Jiang <lijiang(a)redhat.com> writes:
> The commit <cd8954023bd4> broke crash-utility on s390x and got the
> following error:
>
> crash: cannot resolve ".rodata"
>
> The reason is that all symbols containing a "." may be filtered out
> on s390x. To prevent the current failure, a simple way is to check
> whether the symbol ".rodata" exists before calculating the value of
> a symbol.
>
> Fixes: cd8954023bd4 ("kernel: fix start-up time degradation caused by strings
command")
> Reported-by: Alexander Egorenkov <egorenar(a)linux.ibm.com>
> Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
> ---
> kernel.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/kernel.c b/kernel.c
> index 92434a3ffe2d..b504564846c7 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -11790,6 +11790,9 @@ int get_linux_banner_from_vmlinux(char *buf, size_t size)
> struct bfd_section *sect;
> long offset;
>
> + if (!symbol_exists(".rodata"))
> + return FALSE;
> +
> sect = bfd_get_section_by_name(st->bfd, ".rodata");
> if (!sect)
> return FALSE;
> --
> 2.20.1
thanks! This works on s390x.
Sorry, my reply was truncated. How about the following changes?
diff --git a/kernel.c b/kernel.c
index 92434a3ffe2d..b504564846c7 100644
--- a/kernel.c
+++ b/kernel.c
@@ -11790,6 +11790,9 @@ int get_linux_banner_from_vmlinux(char *buf, size_t size)
struct bfd_section *sect;
long offset;
+ if (!symbol_exists(".rodata"))
+ return FALSE;
+
sect = bfd_get_section_by_name(st->bfd, ".rodata");
if (!sect)
return FALSE;
diff --git a/s390.c b/s390.c
index 078b1a25724e..42f5cc63ae52 100644
--- a/s390.c
+++ b/s390.c
@@ -442,6 +442,9 @@ s390_verify_symbol(const char *name, ulong value, char type)
if (strstr(name, "L2\002") == name)
return FALSE;
+ if (STREQ(name, ".rodata"))
+ return TRUE;
+
/* throw away all symbols containing a '.' */
for(i = 0; i < strlen(name);i++){
if(name[i] == '.')
diff --git a/s390x.c b/s390x.c
index c07d283d7f52..d7ee3755fc0b 100644
--- a/s390x.c
+++ b/s390x.c
@@ -1087,6 +1087,9 @@ s390x_verify_symbol(const char *name, ulong value, char type)
if (strstr(name, "L2\002") == name)
return FALSE;
+ if (STREQ(name, ".rodata"))
+ return TRUE;
+
/* throw away all symbols containing a '.' */
for(i = 0; i < strlen(name);i++){
if(name[i] == '.')
Looks good to me.
Tested on s390x, works with get_linux_banner_from_vmlinux().
Thanks!
Regards
Alex