LINUX.ORG.RU

EXPORT_SYMBOL ?


0

0

Не подскажите, где нужно прописывать EXPORT_SYMBOL ? Прописал там, где декларируется переменная, '*.c'-файл,
но при загрузке выдается:
# insmod name.o
name.o: unresolved symbol  name_symbol
#
Нашел кучу объявлений в ksyms.c - может нужно там ?
Нужная мне переменная хранится в машинно-зависимом
разделе (./arch/...), может ли это играть роль ? 
Не знаю, имеет ли это значение, ветка 2.4.xx. Может из
модуля не все можно увидеть? Можите подсказать немного?
anonymous
Ответ на: комментарий от alphex_kaanoken

Думал, что обидел кого, молчите.

static char command_line[COMMAND_LINE_SIZE] = { 0, };
       char saved_command_line[COMMAND_LINE_SIZE];

EXPORT_SYMBOL( saved_command_line);

очень не хочу никого обижать,
знаю на собственной шкуре как это плохо.

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

Вроде правильно все, а где определена переменная? В ядре или модуле. Тут просто нужно обратить внимание на иерархичность подхода загрузки модулей, модуль не стартует пока не появится все что ему нужно. Если этого хочется избежать, то лучше использовать чтото типа symbol_get, symbol_put

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

Спасибо, попробую поискать как использовать symbol_get. Я и не знаю честно говоря. Эта часть кода, которая зависит от аррхитектуры ./arch/.../kermel/... Компилируется эта часть в ядре статически.

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

>Компилируется эта часть в ядре статически.

Уже интереснее. А есть ли присутствие этого символа в System.map или /proc/kallsyms?

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

А! 2.4 тут вроде /proc/ksyms или чтото вроде того. Если отсутствует описание символа, то видимо во время сборки чтото не срослось.

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

Отсутствует в /proc/ksyms
а в Syspem.map - присутствует.

а что может не сростисть ? 
Есть способ как-то это вылечить ?
Может нужно еще куда прописать ?

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

А ядро точно то что нужно загружается? эти файлы по идее не должны отличаться для тех символов что в ядре вкомпилены. Разумеется могут добавляться те что присутствуют в загруженных модулях. Но тут всетаки чтото не то.

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

Ядро вроде то. Я старался аккуратно делать.

> не должны отличаться для тех символов что в ядре 
> вкомпилены

не совсем понял, имеется ввиду System.map и то, что отображает ядро в /proc/ksyms ?

а может влиять на загрузку сам файл System.map - или это просто отображение, которое создается при сборки ядра.
И не влияет на работу системы ?
или влияет, ведь не зря-же его кладут в /boot/ рядом с ядром ? у меня здесь провал, не подскажите ?

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

Тут про него написано кое что

http://www.dirac.org/linux/system.map/

По идее System.map создается при компиляции, а в proc пишется что загрузилось. Если символа в proc нет, то ядро про него не знает. Если это тоже самое ядро, то я даже и не знаю что подсказать.

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

За ссылочку спасибо, попытаюсь разобраться. То есть достаточно в ядре укзать в месте определения символа, что мы его экспортируем и по идее этот символ будет известен и виден? Нет тут ни каких камней ? Может разные уровни или нужно еще куда прописать или в определенном файле нужно прописывать ? Я наткнулся на такой файл: ./arch/i386/kernel/i386_ksyms.c там прописываются некоторый символы, которые видны в ядре. может туда нужно ?

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

>там прописываются некоторый символы, которые видны в ядре. может туда нужно ?

Не думаю, скорее всего описаны они в другом месте, а экспортированы уже тут. По крайней мере я ничего такого не слышал.

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

Да, да, верно, язык мой враг мой, я не точно выразился.
Иненно, экспортируются в этом файле. Может нужно записать в него? Или это все мертвому припарка ? И все и так должно работать, как думаете ?

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

все вышло. :)))
просто супер, огромное Вам спасибо.

Сделал:
в файле: ./arch/sh/kernel/sh_ksyms.c
добавил строчки:
в самом верху:

extern char saved_command_line[]; <-- иначе при сборке
                                      выдается ошибка
                                    unsigned symbol
....

в самом низу:
....
EXPORT_SYMBOL(saved_command_line);


там где декларируется переменная:
static char command_line[COMMAND_LINE_SIZE] = { 0, };
       char saved_command_line[COMMAND_LINE_SIZE];

// EXPORT_SYMBOL(saved_command_line);

в своем модуле:
extern char saved_command_line[];

собрал ядро, собрал модуль.
модуль загружается.

вот карта памяти less /proc/ksyms :
....
8400df80 flush_tlb_all
84001000 empty_zero_page
84165b20 __xdiv64_32
841c425c saved_command_line       <----
8400c380 pci_rmem_create
8400c400 pci_rmem_delete
....

Раньше этого небыло.
Еще раз огромное спасибо за поддержку, советы и рекомендации, супер.

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

Конечно подскажу. Она даже в онлайне есть;)

http://ezs.kr.hsnr.de/TreiberBuch/html/ правда на немецком. Очень хорошая для модулеписания.

Еще в осле есть The Linux Kernel Primer. Очень хорошая книжка

Ну и http://www.linux-kernel.de ее еще не дочитал шибко здоровая, да и не всегда время есть. Напоминает предыдущую. К сожалению только бумажная и на немецком.

Еще есть Linux Device Drivers, третье издание. Ее не читал. Тоже есть в онлайн. http://lwn.net/Kernel/LDD3/

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

спасибо, буду разбираться.

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