Как я могу определить сборку / версию ядра Linux 'uImage'? - PullRequest
4 голосов
/ 05 июля 2010

Я пытаюсь отследить двоичный файл ядра; есть ли способ определить версию (строку сборки) бинарного файла Linux 'uImage'?

Запуск

strings uImage

по трубопроводуРазличные конечные grep утверждения заставляют меня думать, что я имею дело со сжатым изображением ...

Ответы [ 7 ]

5 голосов
/ 02 ноября 2013

Чтобы узнать, какая версия Linux скомпилирована, используйте утилиту strings для несжатого образа vmlinux.

Например:

strings linux-src/build/build-generic/vmlinux|grep "Linux version"

Примервыход:

Linux version 3.2.0-56-generic (root@puerto-cayo) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #86 SMP Fri Nov 1 10:24:18 EDT 2013 (Ubuntu 3.2.0-56.86-generic 3.2.51)

5 голосов
/ 24 июня 2012

В соответствии со спецификацией формата ядра, код C:

kver.c

#include <stdio.h>

int main(int argc, char** argv){
    if (argc > 1){
        FILE* f = fopen(argv[1], "r");
        short offset = 0;
        char str[128];
        if(f){
            fseek(f, 0x20E, SEEK_SET);
            fread(&offset, 2, 1, f);
            fseek(f, offset + 0x200, SEEK_SET);
            fread(str, 128, 1, f);
            str[127] = '\0';
            printf("%s\n", str);
            fclose(f);
            return 0;
        }else {
            return 2;
        }
    } else {
        printf("use: kver [kernel image file]\n");
        return 1;
    }
}

скомпилируйте и запустите:

gcc -o kver kver.c
./kver /boot/vmlinux-something
3 голосов
/ 05 июля 2010

Я только что понял, что ядра, к которым у меня есть немедленный доступ do , хранят несжатую строку версии в заголовках. strings uImage | grep 2.6 должно быть достаточно для любого ядра 2.6, которое охватывает почти все за последние 5+ лет).

(оригинальный ответ следует)


Это теоретически возможно, но не совсем тривиально.

Современные версии ядра Linux используют формат bzImage (для x86 / x86_64, YMMV на других платформах). На самом деле он состоит из заголовка ELF и некоторых других мелочей (например, кода декомпрессии), за которыми следует, да, сжатый образ реального ядра.

Традиционно, алгоритм сжатия был zlib (вопреки распространенному заблуждению, «bzImage» действительно не означало «bzipped image», но «big zImage» - исходный формат zImage не мог обрабатывать большие ядра), хотя версии после 2.6.30 также поддерживают bzip2 и LZMA.

Что вам, вероятно, придется сделать, это точно определить, где начинаются сжатые данные (извините, в этом вам ничего не поможет, но метод проб и ошибок может сработать), и написать немного кода, чтобы запустить его через библиотеку для какой бы алгоритм сжатия ни использовался.

2 голосов
/ 05 июля 2010

Попробуйте file uImage.Он может идентифицировать формат файла, если это широко известный формат сжатия.Кроме этого, утилита strings, вероятно, является лучшей для этой задачи.

1 голос
/ 27 апреля 2016

Это выведет версию ядра и строку localversion (если они были заданы во время сборки) для bzimage:

 strings bzimage |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1

Я протестировал его на версиях ядра 3 и 4 ... ноон также должен работать и в предыдущих версиях.

strings vmlinuz |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
4.4.5
strings vmlinux |grep -E "^[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |awk '{print $1}' |head -1
3.2.45-smp

Если у вас есть uImage, вам придется удалить «^», иначе он не будет совпадать с чем-либо

strings uImage |grep -E "[1-4]\.[0-9][0-9]*\.[0-9][0-9]*" |head -1
Linux-3.0.76
0 голосов
/ 23 мая 2011

Если это ядро ​​для x86, в заголовке указана версия.См. Documentation / x86 / boot.txt (посмотрите на поле kernel_version).

Я не знаю, верно ли то же самое для других архитектур (этот заголовок относится к x86).

0 голосов
/ 05 июля 2010

Я не уверен, однако вы можете попробовать uname -a, может быть, это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...