[완료] 커널 심볼을 못 찾는 문제

bus710의 이미지

현재 s3c2440을 사용한 보드에 웹캠을 장착하는 작업을 진행하고 있습니다.
공개된 드라이버를 이용하는 것이 빠르겠다는 생각에
gspca의 소스를 구하여 컴파일을 해보고 있습니다.

컴파일에는 문제가 없는데 커널 심볼을 못 찾는 문제가 발생하고 있습니다.

kernel config
=============
 
#
# Multimedia devices
#
CONFIG_VIDEO_DEV=y
# CONFIG_VIDEO_V4L1 is not set
CONFIG_VIDEO_V4L1_COMPAT=y
CONFIG_VIDEO_V4L2=y

커널 설정에는 위와 같이 v4l이 설정되어 있습니다.

module compile
==============
 
make CC=arm-linux-gcc LD=arm-linux-ld
 
WARNING: "video_device_release" [/work/gspcav1-20071224/gspca.ko] undefined!
WARNING: "video_device_alloc" [/work/gspcav1-20071224/gspca.ko] undefined!
WARNING: "video_devdata" [/work/gspcav1-20071224/gspca.ko] undefined!

해당 커널 모듈을 컴파일할 때는 위와 같은 옵션을 주었고 위와 같은 경고가 나옵니다.
(제공된 readme를 읽어 보면 gspca_build라는 스크립트를 실행하라고 나옵니다만, 그게 이 문제의 핵심이 아닐거라는 생각이 듭니다)

kallsyms
========
 
cat /proc/kallsyms | grep video_dev
 
c01d4ae4 T video_devdata

실제로 커널 심볼은 위와 같이 존재하는 것으로 나타납니다.

insmod ./gspca.ko 
 
Using ./gspca.ko
gspca: Unknown symbol video_devdata
gspca: Unknown symbol video_device_alloc
gspca: Unknown symbol video_device_release
insmod: cannot insert `./gspca.ko': Unknown symbol in module (-1): No such file or directory

모듈을 적재할 때는 위와 같이 심볼을 찾을 수가 없다는 메시지가 나옵니다.

.......

물론, 세 심볼이 모두 있어야 저의 모든 문제가 일단락 되겠지만,
의아한 부분은 video_devdata 만큼은 찾을 수 있어야 하는게 아닌가 싶습니다.

이 문제에 대해 아시는 분은 힌트라도 부탁 드립니다.^^;

+ 2009 / 04 /13
현재는 다른 보드로 작업을 진행 중 입니다.
레비스 보드 자체의 문제는 아닌 듯하고,
커널이나 컴파일러의 문제인 것 같습니다....^^
밑에 댓글 달아주신 bushi님을 비롯하여 관심 가져주신 분들께
감사 드립니다....^^

bus710의 이미지

소스와 makefile, 결과를 올려 봅니다.

#include \linux/init.h\
#include \linux/module.h\
#include \linux/kernel.h\
 
#include \linux/syscalls.h\
#include \linux/videodev.h\
#include \asm/uaccess.h\
#include \asm/unistd.h\
 
static int hello_init(struct file *file)
{
        printk("hello, world \n");
 
        video_devdata(file);
        return 0;
}
 
static void hello_exit(void)
{
        printk("good bye\n");
}
 
module_init(hello_init);
module_exit(hello_exit);
 
MODULE_LICENSE("Dual BSD/GPL");

obj-m   := test.o
KDIR    := /work/rebisSRC/kernel26/linux-2.6.17.13-rebis
#KDIR   := /lib/modules/2.6.27-11-generic/build/
PWD     := $(shell pwd)
 
CC      = arm-linux-gcc
LD      = arm-linux-ld
 
default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 
clean:
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf .*.cmd
        rm -rf *.o

root@MDS:~# insmod test.ko 
Using test.ko
test: no version for "struct_module" found: kernel tainted.
test: Unknown symbol video_devdata
insmod: cannot insert `test.ko': Unknown symbol in module (-1): No such file ory
root@MDS:~# 

제가 놓친게 뭘까요?
전 아직 짐작가는 부분이 없습니다.

*<>는 \로 대체하였습니다. 오해 없으시길....^^

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

bushi의 이미지

Makefile 에서 CC, LD 는 삭제하시고요.

grep CONFIG_VIDEO_DEV /work/rebisSRC/kernel26/linux-2.6.17.13-rebis/.config
로 built-in 인지 module 인지 확인하시고,
module 이라면 videodev.ko 올리고 built-in 이라면 반드시 새 커널로 부팅하시고요.

보드에 다운로드해서 삽질하지마시고

  $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) INSTALL_MOD_PATH=/tmp INSTALL_MOD_STRIP=1 modules modules_install

정도로 하면 /tmp/lib/modules/2.6.17.13*/extra/ 에 설치되면서 symbol 검사까지 미리 해줍니다.
다이어트는 덤.

cross 컴파일할 땐 /work/rebisSRC/kernel26/linux-2.6.17.13-rebis/Makefile 의
CROSS_COMPILE 을 arm-linux- 처럼 고치는게 편하고, 고치지 못할 이유가 있다면
역시 make CROSS_COMPILE=arm-linux- 처럼 사용하세요.

OTL

bus710의 이미지

가뭄의 단비 같은 답변이었습니다.
복 받으실 겁니다...^^
말씀하신 대로 실행해 보았습니다....

CONFIG_VIDEO_DEV=y

먼저 grep 시에는 위와 같이 나옵니다. y니까 빌트인 되어 있는 것 같습니다.
해당 커널로 부팅을 하고나서 적어주신 make 구문을 이용해 보았습니다.

WARNING: /tmp/lib/modules/2.6.17.13/extra/test.ko needs unknown symbol video_devdata

위와 같은 문제가 발생하네요.
알려지지 않은 심볼을 선언했기 때문에 생기는 문제인데, kallsyms 이나 system.map에는 분명 video_devdata가 선언되어 있는게.....이상합니다.

그래도 감사 드립니다^^

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

bushi의 이미지

편하죠. 보드의 커널 문제가 아니라는 게 밝혀졌습니다.

OTL

bus710의 이미지

kmalloc을 써보니 문제 없이 잘 되네요...

임베디드에서 video_devdata를 쓰는 뭔가 특별한 방법이 있나 봅니다.

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

bushi의 이미지

별로 특별하진 않은데요, linux-2.6.17 을 당장 쓰는 곳이 없어 임시로 2.6.29-rc7 에서 시험해봤습니다.
API 가 약간 바뀌긴했는데, 크게 다르진 않구요.
(제 PC 에선 /work 가 /space/work 의 link 입니다. 보실 때 혼란스럽더라도 양해를...)

[bushi@rose kmod]$ 
[bushi@rose kmod]$ cat test.c
#include <linux/init.h>
#include <linux/module.h>
 
#include <media/v4l2-common.h>
 
static __init int hello_init(void)
{
        printk("hello, world \n");
 
        video_drvdata(NULL);
        return 0;
}
 
static __exit void hello_exit(void)
{
        printk("good bye\n");
}
 
module_init(hello_init);
module_exit(hello_exit);
 
MODULE_LICENSE("Dual BSD/GPL");
 
[bushi@rose kmod]$ 
[bushi@rose kmod]$ cat Makefile
obj-m   := test.o
KDIR    := /work/SMDK6410/linux-2.6.29-rc7
PWD     := $(shell pwd)
 
modules:
      @$(MAKE) -C $(KDIR) M=$(PWD) V=$(V) \
            INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=/tmp \
            modules modules_install
 
prepare:
      @$(MAKE) -C $(KDIR) zImage modules modules_install
 
clean:
      @$(MAKE) -C $(KDIR) M=$(PWD) clean
      @rm -f Module.markers modules.order
[bushi@rose kmod]$ 
[bushi@rose kmod]$ 
[bushi@rose kmod]$ 
[bushi@rose kmod]$ make prepare modules
make[1]: Entering directory `/space/work/SMDK6410/linux-2.6.29-rc7'
  CHK     include/linux/version.h
make[2]: `include/asm-arm/mach-types.h'는 이미 갱신되었습니다.
  CHK     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-arm
  CALL    scripts/checksyscalls.sh
<stdin>:1097:2: warning: #warning syscall fadvise64 not implemented
<stdin>:1265:2: warning: #warning syscall migrate_pages not implemented
<stdin>:1321:2: warning: #warning syscall pselect6 not implemented
<stdin>:1325:2: warning: #warning syscall ppoll not implemented
<stdin>:1365:2: warning: #warning syscall epoll_pwait not implemented
  CHK     include/linux/compile.h
  Kernel: arch/arm/boot/Image is ready
  Kernel: arch/arm/boot/zImage is ready
  Building modules, stage 2.
  MODPOST 7 modules
  INSTALL drivers/media/video/v4l1-compat.ko
  INSTALL drivers/media/video/v4l2-common.ko
  INSTALL drivers/media/video/v4l2-int-device.ko
  INSTALL drivers/media/video/videodev.ko
  INSTALL drivers/scsi/scsi_wait_scan.ko
  INSTALL drivers/usb/gadget/g_ether.ko
  INSTALL drivers/usb/gadget/s3c-udc-otg-hs.ko
  DEPMOD  2.6.29-rc7-smdk6410
make[1]: Leaving directory `/space/work/SMDK6410/linux-2.6.29-rc7'
make[1]: Entering directory `/space/work/SMDK6410/linux-2.6.29-rc7'
  LD      /home/bushi/net/kmod/built-in.o
  CC [M]  /home/bushi/net/kmod/test.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/bushi/net/kmod/test.mod.o
  LD [M]  /home/bushi/net/kmod/test.ko
  INSTALL /home/bushi/net/kmod/test.ko
  DEPMOD  2.6.29-rc7-smdk6410
make[1]: Leaving directory `/space/work/SMDK6410/linux-2.6.29-rc7'
[bushi@rose kmod]$

(code 태그에서 tab 이 제대로 표시되지 않는 버그, 언제고쳐지려나요 ?)

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.