用cygwin编译内核模块的问题,急,在线等待!!

wgc12321 2004-05-04 10:33:22
我在cygwin下用strong arm的交叉编译器编译下面的一个超简单的模块,结果问题多多。
/*hello.c*/
#include <linux/kernel.h> /* We’re doing kernel work */
#include <linux/module.h> /* Specifically, a module */
/* Deal with CONFIG_MODVERSIONS */
/*
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
*/
/* Initialize the module */
int init_module()
{
printk("Hello, world - this is the kernel speaking\n");
return 0;
}

void cleanup_module()
{
printk("Short is the life of a kernel module\n");
}

当我直接用cygwin的linux内核时,即如下的makefile
/*makefile*/
CC=arm-linux-gcc
LDFLAGS=-Xlinker -rpath-link /usr/local/lib/gcc-lib/arm-linux/2.95.2-6
LFLAGS-Wall -DMODULE -D__KERNEL__ -DLINUX
all: hello.o

hello.o: hello.c /usr/src/linux-2.4.19/include/linux/version.h
$(CC) hello.c $(LFLAGS) -c

没有什么错误,提示如下:
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccm0CEMS.s: Assembler messages:
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccm0CEMS.s:6: Warning: Ignoring changed section attributes for .modinfo

当我加上-I参数用新的内核编译的时候,即如下makefile
/*makefile*/
CC=arm-linux-gcc
LDFLAGS=-Xlinker -rpath-link /usr/local/lib/gcc-lib/arm-linux/2.95.2-6
LFLAGS=-I/usr/src/linux-2.4.19-sa1110/include -Wall -DMODULE -D__KERNEL__ -DLINUX
all: hello.o

hello.o: hello.c /usr/src/linux-2.4.19/include/linux/version.h
$(CC) hello.c $(LFLAGS) -c

出现如下错误:
In file included from /usr/src/linux-2.4.19-sa1110/include/linux/prefetch.h:13,
from /usr/src/linux-2.4.19-sa1110/include/linux/list.h:6,
from /usr/src/linux-2.4.19-sa1110/include/linux/module.h:12,
from hello.c:2:
/usr/src/linux-2.4.19-sa1110/include/asm/processor.h:50: warning: no semicolon a
t end of struct or union
/usr/src/linux-2.4.19-sa1110/include/asm/processor.h:50: parse error before `1'
/usr/src/linux-2.4.19-sa1110/include/asm/processor.h:52: parse error before `}'
/usr/src/linux-2.4.19-sa1110/include/asm/processor.h:56: field `insn' has incomp
lete type
make: *** [hello.o] Error 1

注:所用新的内核单独编译没有错误。

怎么办?
高手救我
3x very much!!
...全文
137 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgc12321 2004-05-14
  • 打赏
  • 举报
回复
luckydean(老怪),去天网搜一下arm-linux-gcc,肯定能找到
luckydean 2004-05-13
  • 打赏
  • 举报
回复
to潇湘夜雨:怎样看它的链接:)
tianxiangyuan 2004-05-11
  • 打赏
  • 举报
回复
你的asm链接正确吗?
luckydean 2004-05-11
  • 打赏
  • 举报
回复
小春:我的cywin没有arm-linux-gcc,哪里有的下载,怎样建立arm-linux交叉编译环境?谢了!
wgc12321 2004-05-06
  • 打赏
  • 举报
回复
自己搞定
using kernel for compiling our modules
1.把源文件(比如是hello.c)放到kernel的一个目录下,比如drivers/misc
然后修改config.in和makefile
在config.in里加上
dep_tristate 'Hello World Module' CONFIG_MCP_UCB1200_HELLO
在makefile里加上
obj-$(CONFIG_MCP_UCB1200_HELLO) += hello.o

如果要动态加载的话内核配置中make menuconfig,选上Loadable module support
然后将要动态加载的模块设置为[M]

最后在内核根目录下执行make modules

2.根据你的内核情况修改下列makefile文件:
#makefile

TOPDIR=/usr/src/linux-2.4.19
obj-m = hello.o
build:
$(MAKE) -C $(TOPDIR) SUBDIRS=$(shell pwd) modules
include /usr/src/linux-2.4.19/Rules.make
install:
@# completely broken ATM - removes the whole dir
@#make -C $(KSRC) SUBDIRS=`pwd` modules_install
@echo "Install it yourself ..."
clean: @# kbuild can't handle this (yet ?)
@#make -C $(KSRC) SUBDIRS=`pwd` clean
rm -f *.o *.ko *.mod.o *.mod.c .*.{cmd,flags}
rm -rf config.status config.log autom4te*.cache

然后make就行了
wgc12321 2004-05-05
  • 打赏
  • 举报
回复
怎么没人帮我了?
五一节高手都放假了?
wgc12321 2004-05-04
  • 打赏
  • 举报
回复
自己up
wxywh 2004-05-04
  • 打赏
  • 举报
回复
关注,顶。
编译过程: 1). 解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下, 你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台. 3). make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean" 4). 如果安装了bochs,直接双击bochsrc.bxrc即可运行Linux-0.11了. 5). 也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了 6). 在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车 这就是能在windows环境下编译的Linux 0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW. 下面是在Windows下编译Linux 0.11会遇到的问题和对原文件作的修改: 1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它Windows下的编译器保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序引用的汇编程序中的变量加上下划线. 2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.在Makefile作的主要修改: 在LDFLAGS中加了--image-base 0x0000 将elf_i386改成i386pe 将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe 因为类似的原因,make dep会出错 4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows下的可执行文件的格式,显然是不能直接执行的,必须加以转化.我实现了通过两种方式加以转化. 1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块直接加载的.我已经将这个程序放在了Linux-0.11的tools目录下,要微软的编译编译. 2)自己写一个PE Loader,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释. 5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.在Link的过程中,init目录下的main.c会出现以下错误: boot/head.o(.text+0x540c):fake: undefined reference to `_main' init/main.o(.text+0x16f):main.c: undefined reference to `_alloca' init/main.o(.text+0x174):main.c: undefined reference to `__main' make: *** [tools/system.exe] Error 1 第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,在gcc的编译选项里也有-nostdinc .有一个解释是main函数不是一个普通的函数,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把main.c下面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了. 在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的,有了在Windows下编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。 也要感谢Linux内核完全注释的作者赵炯博士,是他拉接了操作系统与操作系统爱好者的距离. 最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友. 我的网名:flyfish 我的QQ:785606288 E-mail:I2CBus@126.com 另外,要转载请保持本文件的完整性,请尊重别人的劳动果实. 修改日志: 08/3/29 修改了一下Makefile,旧的Makefile在某些文件更新后还会重新编译。 修改了Trans.cpp中的一个dug,该dug在translate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress 08/4/2 修改了下MinGW32.bat,现在已经不用重设路径了。 08/4/4 Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。 权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法,

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧