LINUX.ORG.RU

Unknown symbol

 


0

1

Доброй ночи. Пишу модуль ядра.
В коде модуля подгружаю модуль zlib
В систему подгружается вместе с zlib также zlib_deflate

Далее смотрю, что имеем.


cat /proc/kallsyms | grep zlib

ffffffff811ca13c t zlib_adler32
ffffffff811ca289 T zlib_inflate_workspacesize
ffffffff811ca28f T zlib_inflateReset
ffffffff811ca331 T zlib_inflateInit2
ffffffff811ca384 T zlib_inflateEnd
ffffffff811ca398 t zlib_updatewindow
ffffffff811ca438 T zlib_inflateIncomp
ffffffff811ca4bb T zlib_inflate
ffffffff811cb2c4 T zlib_inflate_blob
ffffffff811cb380 T zlib_inflate_table

Далее внутри своего модуля вызываю функцию crypto_alloc_comp(«deflate», 0, CRYPTO_ALG_ASYNC);

И тут если ввести dmesg Увидим следующее.


[ 458.411621] deflate: Unknown symbol zlib_deflateEnd (err 0)
[ 458.411642] deflate: Unknown symbol zlib_deflate (err 0)
[ 458.411658] deflate: Unknown symbol zlib_deflateReset (err 0)
[ 458.411673] deflate: Unknown symbol zlib_deflate_workspacesize (err 0)
[ 458.411693] deflate: Unknown symbol zlib_deflateInit2 (err 0)


В исходниках ядра, объявление данных функций находится в файле linux-3.2.12/lib/zlib_deflate/deflate.c a их экспортирование производится в файле linux-3.2.12/lib/zlib_deflate/deflate_syms.c

Почему zlib_deflate загружается в системе, но данные функции не доступны? как это обойти?

Deleted

Навскидку, не смотря в код:

1)Экспортируются, как GPL-символы, а твой модуль проприетарный?
2)Неправильный порядок загрузки модулей?
3)Простое невезение?

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Модуль тоже GPL
Как понять «неправильный порядок загрузки модулей» ???

Deleted
()
root@host:~# modprobe zlib_deflate
root@host:~# lsmod | grep zlib
zlib_deflate           19657  0 
root@host:~# cat /proc/kallsyms | grep zlib_deflateEnd
7f12502c T zlib_deflateEnd      [zlib_deflate]
root@host:~# 

Что-то у тебя явно не подгружается. Откуда взял ядро? Откуда модули? Модули соответствуют версии ядра? Менял ядро и делал ли modules_install после этого? initrd используешь?

xydo ★★
()
Ответ на: комментарий от xydo

Ядро взял с одного из источников backports debian
Ядро под названием 3.2.1-3.bpo.2 хотя LINUX_VERSION_CODE == KERNEL_VERSION(3,2,12) а не 3.2.1
Смотрю cat /proc/kallsyms | grep zlib_deflateEnd
ffffffffa0341000 T zlib_deflateEnd [zlib_deflate]
Сейчас при вызове crypto_decompress_setup просто вылетает Oops может я просто в коде косячу?



[ 497.684795] BUG: unable to handle kernel NULL pointer dereference
at (null)
[ 497.684813] IP: [< (null)>] (null)
[ 497.684827] PGD 0
[ 497.684834] Oops: 0010 [#1] SMP


Вот код.


struct pcomp_vec
{
void *params;
unsigned int paramsize;
int inlen;
int outlen;
char *input_ptr;
};
.....
....
.... вызов функции которая даёт сбой

struct crypto_comp *tfm = NULL;
struct comp_request req;
struct pcomp_vec vec;
int res;

/* Выделение памяти под «struct crypto_tfm» */
//tfm = crypto_alloc_cipher(«deflate», 0, CRYPTO_ALG_ASYNC);
tfm = crypto_alloc_comp(«deflate», 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm)) return ERR;

/*Заполнение структуры вектора */
vec.params = (void *)&deflate_decomp_params;
vec.paramsize = sizeof(deflate_decomp_params);
vec.inlen = compressed_data_len;
vec.outlen = result_buf_len;

/* Установка параметров декомпрессии */
res = crypto_decompress_setup(tfm, vec.params, vec.paramsize);

// До сюда код не доходит!!!!!



Module_install не делал.
initrd - не использую, что это? для чего нужно?

Deleted
()
Ответ на: комментарий от Deleted

Насколько я понимаю, deflate используется для сжатия, а не для декомпрессии. Поэтому crypto_decompress_setup и переходит по нулевому адресу, о чем свидетельствует отладочное сообщение.
Для декомпрессии используй:
tfm = crypto_alloc_comp(«zlib», 0, CRYPTO_ALG_ASYNC);

xydo ★★
()
Ответ на: комментарий от Deleted

Похоже, из-за CRYPTO_ALG_ASYNC. не поддерживает, видимо. используй CRYPTO_ALG_TYPE_PCOMPRESS.
Кстати, чем не понравился пример годовалой давности?
[kernel] Zlib

xydo ★★
()
Ответ на: комментарий от xydo

Так я по тому примеру и делаю, точнее смотрю какие изменения в новом ядре, и код данный мне год назад подправляю.
tfm = crypto_alloc_comp(«zlib», 0, CRYPTO_ALG_TYPE_PCOMPRESS);
Выдаёт туже ошибку.
tfm = crypto_alloc_comp(«deflate», 0, CRYPTO_ALG_TYPE_PCOMPRESS);
Выдаёт Oops: BUG: unable to handle kernel NULL pointer dereference

Чтоже делать? (

Deleted
()
Ответ на: комментарий от Deleted

Оказалось правильно делать:
tfm = crypto_alloc_pcomp(«zlib», 0, CRYPTO_ALG_TYPE_AEAD);
Всем спасибо за уделённое мне время и оказанную помощь!

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.