概述
AIX有本土的C编译器XLC,不过这个东西不是免费的。所以我今天尝试了一下用GCC在AIX系统上做内核扩展的实验,当然过程并不是一帆风顺的,这很正常,好在最终成功实现了,期间离不开google上其他网友的分享,所以我也在这篇博文里尽可能完整地把这其中每个过程记录下来.
首先,我们需要在AIX环境下安装GCC,这个我直接从网上下rpm包,然后用rpm命令安装。gcc for aix的rpm包可以从下面的链接获得:
因为我自己经常遇到链接失效的问题,所以在此我希望你足够幸运能打开这个链接,至少今天在我这里是可以的,我下的文件是
文件下来之后,用rpm -ivh gcc-4.2.0-3.aix6.1.ppc.rpm就会把GCC安装到系统上了,这步非常简单,应该不会出错。安装好之后,运行一下gcc -v的输出如下:
bash-3.2# gcc -v
Using built-in specs.
Target: powerpc-ibm-aix6.1.0.0
Configured with: ../configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld --enable-languages=c,c++,java --prefix=/opt/freeware --enable-threads --enable-version-specific-runtime-libs --host=powerpc-ibm-aix6.1.0.0 --target=powerpc-ibm-aix6.1.0.0 --build=powerpc-ibm-aix6.1.0.0 --disable-libjava-multilib
Thread model: aix
gcc version 4.2.0
有了GCC之后,接下来就是实际的做一个AIX内核扩展,源码直接来自:Writing AIX Kernel Extension
下面开始编译链接过程,这个对新手来说是最容易出错的环节:
a. 编译(但不链接):
bash-3.2# gcc -D_KERNEL -g -O2 -pipe -maix64 -ffreestanding -msoft-float -c kernext_hello.c
上面的-O2选项很重要,否则接下来的ld阶段会出现一个类似下面的错误:
bash-3.2# ld -o kernext_hello -b64 -bI:/usr/lib/kernex.exp -lsys -lcsys -e hello_init kernext_hello.o
ld: 0711-317 ERROR: Undefined symbol: .__fd_getdtablesize
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
编译阶段成功生成了一个kernext_hello.o目标文件,用file命令看一下其格式:
bash-3.2# file kernext_hello.o
kernext_hello.o: 64-bit XCOFF executable or object module not stripped
b.链接
bash-3.2# ld -o kernext_hello -b64 -K -bI:/usr/lib/kernex.exp -lsys -lcsys -ehello_init kernext_hello.o
这步将产生一个AIX内核模块kernel_hello.
然后就可以通过下面的命令来加载卸载该模块了:
bash-3.2# ./kctrl ./kernext_hello
内核模块中消息的输出可以采用诸如:uprintf("hello world, command=0x%xn", cmd);这样的方式,虽然有bsdlog这样的函数,但是我试了很久也没有成功,倒是直接在命令行中启动syslogd才可以看到log信息,不过又出现大量message的现象,后来我索性放弃了,因为我觉得uprintf蛮好。
过程其实蛮简单的,善于利用google就可以了。再次感谢其他网友的无私奉献!
阅读(5424) | 评论(2) | 转发(0) |
最后
以上就是直率蜡烛为你收集整理的aix内核是linux,使用GCC在AIX6.1系统上进行内核扩展的全部内容,希望文章能够帮你解决aix内核是linux,使用GCC在AIX6.1系统上进行内核扩展所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复