Hi, Lianbo
On 04/26/2021 03:46 PM, lijiang wrote:
在 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@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(a)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])))
......
}
Thank you for your suggestion, but I have a question.
For a type like "gcc-", how to get its offset?
Like "gcc version ", it can be as follows:
p1 += strlen("gcc version ");
Thanks,
Youling
Thanks.
Lianbo
> Thanks,
> Mathias
>
>> Signed-off-by: Youling Tang <tangyouling(a)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,
>>