Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562325
  • 博文数量: 77
  • 博客积分: 1205
  • 博客等级: 少尉
  • 技术积分: 4476
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 21:48
文章分类
文章存档

2018年(1)

2017年(1)

2015年(1)

2014年(18)

2013年(12)

2012年(44)

分类: 系统运维

2012-09-28 15:44:50

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%x\n", cmd);这样的方式,虽然有bsdlog这样的函数,但是我试了很久也没有成功,倒是直接在命令行中启动syslogd才可以看到log信息,不过又出现大量message的现象,后来我索性放弃了,因为我觉得uprintf蛮好。

过程其实蛮简单的,善于利用google就可以了。再次感谢其他网友的无私奉献!





阅读(6034) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

MagicBoy20102014-05-30 09:59:05

EncoreDeng:博主您好,关于使用GCC编译AIX内核扩展,我还有一个疑问.
在Writing AIX Kernel Extension 中提到的除了kernext_hell之外,还有demo_syscall这个范例.
范例中提供了一个增加AIX系统调用的办法.
请问博主您是否能够成功使用GCC进行编译?

谢谢!

可以的

回复 | 举报

EncoreDeng2014-05-28 12:18:04

博主您好,关于使用GCC编译AIX内核扩展,我还有一个疑问.
在Writing AIX Kernel Extension 中提到的除了kernext_hell之外,还有demo_syscall这个范例.
范例中提供了一个增加AIX系统调用的办法.
请问博主您是否能够成功使用GCC进行编译?

谢谢!