LINUX.ORG.RU

Можете смеяться, но у меня глючит strlen


0

0

У меня в исходниках есть один файл utils.h и внутри него вызывается функция strlen. При сборке он мне выдает unknown symbol in module (исходники модуля). В том же файле есть strcpy, но она работает нормально. Я уже пробовал подключать string.h, linux/string.h string и cstring, и все равно ничего не работает. Почему?


Совет стандартный - уменьшать код до того момента пока глюк проявляется. А там и видно будет.

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

А ты каким компилером компилишь? не сишным?

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

>Может строки пересекаются или копирование выходит за границы выделенной памяти для строк...

отличный повод выдавать compile-time error

anonymous
()

Ну ничегошеньки не понял. Ты что пишешь? Модуль ядра? Кто выдает unknown symbol in module? Линковщик? При компиляции таких ошибок быть не может. Посмотри как ты собираешь свой модуль и сравни с примерами. IMHO, дело не в исходнике, а в том, как ты его собираешь.

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

>отличный повод выдавать compile-time error

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

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

Что до модуля, то определения strcpy/strlen находятся в одном файле, плюс версионироваться должны одинаково. Как может быть одно, но не быть другого... :)

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

Я компилю модуль ядра, он собирается нормально, а команда unknown symbol выдается, когда я пишу insmod mymodule.ko. Насчет компилятора: этот файл подключается как к c так и к cpp файлам, а собираю я модуль обычно: obj-m += mymodule.o и.т.д.

>Как может быть одно, но не быть другого

Это для меня вообще загадка :-)

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

Вопрос из разряда "пальцем в небо"(учитывая, что strlen на i386 таки inline): вы #define __KERNEL__ (или gcc -D__KERNEL__) сделали, включив linux/string.h?

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

> При сборке он мне выдает unknown symbol in module (исходники модуля).

Rendal (*) (24.08.2005 15:14:33)

> а команда unknown symbol выдается, когда я пишу insmod mymodule.ko

Rendal (*) (24.08.2005 18:13:28)

Не станем дойобываться до слова "команда", но, всё-таки, когда же именно выводится сообщение об ошибке?

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

Вот ты странный кокой-то, тебе же обьяснили, разберись что ты пишешь, модуль для ядра или обычную программу. Откуда у тебя <string.h> в модуле для ядра? Если модуль, то используй <linux/string.h>.

anonymous
()

Покажи точно, что именно выводит тебе insmod.

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

Вроде по-русски написал: КОМПИЛЮ МОДУЛЬ ЯДРА. А в самом первом сообщении я специально указал, что пробовал и linux/string.h и все остальное.
Точно также писал и то, что сообщение об ошибке выдается в тот момент, когда я пишу insmod. То что он пишет у меня тоже указано.
По поводу -D__KERNEL__ - это у меня прописано в makefile.

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

Как-то все вдруг заработало :-) Так сам толком и не понял, как проблема решилась, похоже где-то у меня в исходниках был глюк с заголовочными файлами. Заработало после того, как в файле, куда подключается utils.h перенес строку с include наверх :) Всем большое спасибо за ответы.

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