[Crash-utility] [PATCH] Fix gcc_version character display

lijiang lijiang at redhat.com
Mon Apr 26 07:46:15 UTC 2021


在 2021年04月26日 15:17, Mathias Krause 写道:
> Am 25.04.21 um 07:50 schrieb Youling Tang:
>> When using the "help -k" command in the 5.12 kernel, it was found that the
>> gcc_version character string was displayed as 0.0.0.
>> Check the value of the proc_version string to know,
>>    crash> help -k
>>    ...
>>    proc_version: Linux version 5.12.0-rc2kexec+ (root at bogon) (gcc (GCC) 7.3.1
>>    20180303 (Red  Hat 7.3.1-6), GNU ld version 2.28-13.fc21.loongson.6) #30
>>    SMP PREEMPT Thu Apr 22 09:04:57 HKT 2021
>>    ...
>>
>> Therefore, the "gcc (GCC)" character should be searched to obtain the correct
>> character string "gcc_version" value.
> 
> I don't think that's sufficient to catch current kernels.
> 
> Here's another data point from a Debian system:
> 
> $ cat /proc/version
> Linux version 5.9.0-0.bpo.5-amd64 (debian-kernel at lists.debian.org) (gcc-8 (Debian 8.3.0-6) 8.3.0, GNU ld (GNU Binutils for Debian) 2.31.1) #1 SMP Debian 5.9.15-1~bpo10+1 (2020-12-31)
> 
> So the below pattern won't match this one either.
> 
> Maybe we should give up on extracting the version and simply use the full string for diagnostical messages? Like extracting everything from "gcc" till the next ","?
> 
If there are several cases just like "(gcc-8 (Debian 8.3.0-6)", "gcc (GCC) 7.3.1" and "gcc version 8.4.1", I would suggest to
define an array for them and handle them in a loop. For example:

static char *gcc_version[] = {
	"gcc version ",
	"gcc (GCC) ",
	"gcc-",
	NULL,
}


for (int i = 0; gcc_version[i], i++) {
    if ((p1 = strstr(kt->proc_version, gcc_version[i])))
	......

}

Thanks.
Lianbo


> Thanks,
> Mathias
> 
>>
>> Signed-off-by: Youling Tang <tangyouling at loongson.cn>
>> ---
>>   kernel.c | 10 +++++++---
>>   1 file changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/kernel.c b/kernel.c
>> index 528f6ee..a1872c2 100644
>> --- a/kernel.c
>> +++ b/kernel.c
>> @@ -1103,9 +1103,13 @@ verify_version(void)
>>       /*
>>        *  Keeping the gcc version with #define's is getting out of hand.
>>        */
>> -    if ((p1 = strstr(kt->proc_version, "gcc version "))) {
>> +    if ((p1 = strstr(kt->proc_version, "gcc version ")) ||
>> +         (p1 = strstr(kt->proc_version, "gcc (GCC) "))) {
>>           BZERO(buf, BUFSIZE);
>> -        p1 += strlen("gcc version ");
>> +        if (strstr(kt->proc_version, "gcc version "))
>> +            p1 += strlen("gcc version ");
>> +        else
>> +            p1 += strlen("gcc (GCC) ");
>>           p2 = buf;
>>           while (((*p1 >= '0') && (*p1 <= '9')) || (*p1 == '.')) {
>>               if (*p1 == '.')
>> @@ -3661,7 +3665,7 @@ module_init(void)
>>                       modules_found = TRUE;
>>                       break;
>>                   }
>> -            }
>> +            }
>>                 if (!modules_found) {
>>                               error(WARNING,
>>
> 




More information about the Crash-utility mailing list