目次: Linux
クロスコンパイルが楽そうなLinux kernelですが、2.4.33.5がコンパイルできない。
$ make bzImage (...snip...) make[1]: Entering directory `/home/katsuhiro/share/tmp/cross/build/linux-2.4.33.5/drivers' make -C block make[2]: Entering directory `/home/katsuhiro/share/tmp/cross/build/linux-2.4.33.5/drivers/block' make all_targets make[3]: Entering directory `/home/katsuhiro/share/tmp/cross/build/linux-2.4.33.5/drivers/block' arm-linux-gcc-3.4.4 -D__KERNEL__ -I/home/katsuhiro/share/tmp/cross/build/linux-2.4.33.5/include \ -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing \ -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 \ -march=armv4 -mtune=arm9tdmi -malignment-traps -msoft-float -Uarm \ -nostdinc -iwithprefix include -DKBUILD_BASENAME=blkpg -c -o blkpg.o blkpg.c blkpg.c: In function `blk_ioctl': blkpg.c:252: error: asm-specifier for variable `__r1' conflicts with asm clobber list blkpg.c:252: 前のエラーにより混乱していますので、脱出します (...snip...)
put_userと、u64の組み合わせがまずいのか、put_userを使っている各所でこのエラーが出ます。
if (cmd == BLKGETSIZE)
return put_user((unsigned long)ullval, (unsigned long *)arg);
else
return put_user(ullval << 9, (u64 *)arg);
gcc-3.3.5がダメなのかと思って、gcc-3.4.4でコンパイルしてみた(3.4では-mshort-load-bytesを -malignment-trapsに変えないと別のエラーになる)ものの、やはり同じ。いっそ立ち戻って2.95とか、新しい4系でやるべきでしょうか。
つーか、ARM用のカーネルって世の中にいっぱいあると思うんだが、誰がどうやってコンパイルしてるんだよ?
ちなみにgccに文句を言われるput_userは以下のようなマクロです。行末の継続記号は省いています。
こんなに長いのにマクロなのはinline展開に比べて何か良いことがあるからでしょう。たぶん。
#define put_user(x,p) (
{
const register typeof(*(p)) __r1 asm("r1") = (x);
const register typeof(*(p)) *__p asm("r0") = (p);
register int __e asm("r0");
switch (sizeof(*(p))) {
case 1:
__put_user_x(__r1, __p, __e, 1, "r2", "lr");
break;
case 2:
__put_user_x(__r1, __p, __e, 2, "r2", "lr");
break;
case 4:
__put_user_x(__r1, __p, __e, 4, "r2", "lr");
break;
case 8:
__put_user_x(__r1, __p, __e, 8, "ip", "lr");
break;
default:
__e = __put_user_bad();
break;
}
__e;
})
#define __put_user_x(__r1,__p,__e,__s,__i...)
__asm__ __volatile__ (
"bl __put_user_" #__s
: "=&r" (__e)
: "0" (__p), "r" (__r1)
: __i
)
put_userが呼んでいる __put_user_xの前半を見ると、サイズ(1, 2, 4, 8)に応じて __put_user_1とか __put_user_2などを呼ぶ(blはブランチ命令)関数みたいです。
gccのインラインアセンブラが理解できないので、後半がイマイチわからないんですが…。誰か読めませんか?これ。
どうでもいいけど、これ見ていたら、gccってマクロの引数を可変にできることに気づきました。
gcc専用のコードになってしまうのが難点だけど、メチャクチャ便利だな。
ドコモとのミーティングをなぜか明日だと思っていてすっぽかしてしまった。やってしまった。
さらに今日、停電になるのを忘れていて、リモートからの作業中にマシンが落ちた。
研究室に行って、電源投入してきた。
昨日、今日と研究室に行ったせいか、のどが痛い。研究室は暖かくて良いんですけど、猛烈にのどと目が痛くなる。
hdk氏にそれは登校拒否だって言われた。否定できないよ、うわぁぁヽ(`Д´)ノぁぁーん!
< | 2006 | > | ||||
<< | < | 12 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |
合計:
本日: