コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2006年12月19日 >>> 2006年12月19日
link もっと後

2006年12月19日

Linux kernel 2.4 for ARMがクロスコンパイルできない

目次: 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氏にそれは登校拒否だって言われた。否定できないよ、うわぁぁヽ(`Д´)ノぁぁーん!

編集者:すずき(2023/04/29 21:52)

コメント一覧

  • ち。さん(2006/12/20 20:02)
    1: __asm__ __volatile__ (
    2: "bl __put_user_" #__S
    3: : "=&r" (__e)
    4: : "0" (__p), "r" (__r1)
    5: : __i
    6: )

    で説明すると
    1:は__volatile__なので最適化不可のインラインアセンブラ定義
    2:は""でくくられた部分はそのまま埋め込まれて、#以降はコメントです。

    3:以降はちょっとややこしいのですが、アセンブラ埋め込みの前後の処理を書いています。
    いわゆる拡張インラインアセンブラの部分です。それぞれの処理がコロンで区切られていて
    3:が出力レジスタ
    4:が入力レジスタ
    5:が使用するレジスタが指定されています。

    3:は`=`がWrite-onlyで書き込まれるレジスタ、`&`がearlyclobber operandとなっていて
    インラインアセンブラ内で読んで書き込まれた後に再び読まれるレジスタをあらわします(たぶん)。
    `r`は汎用レジスタであることを示しています。カッコ内は変数を指定しています。
    これらの指定によって、埋め込むアセンブラの後にレジスタの値を変数へ書き込むコードが挿入されます。

    4:の`0`は0番目のconstrain、つまり"=&r" (__e)を指します。3:と同様、カッコ内は変数です。
    これらの指定によって、埋め込むアセンブラの前に変数の値をレジスタに書き込むコードが挿入されます。

    5:は使用されるレジスタが記述されます。埋め込むアセンブラ内で使用するレジスタをここに書くことで
    埋め込むコードの前後にこれらのレジスタを退避・復帰するコードが挿入されます。

    で、3:と4:で指定した変数をレジスタとみなして%0,%1,%2みたいな形でアセンブラを書けるんですが
    ("add %1,%0"みたいな記述ができるようになる)このソースには含まれてないですね。

    詳細はGCCのドキュメント"Using the GNU Compiler Collection"に書かれていますので
    やる気があったらがんばって読んでみてください。
  • すずきさん(2006/12/20 20:09)
    アセンブラの神が降臨していただいたおかげで、勉強になります。
    #ってコメントか。文字連結じゃないんですね。

    だとすると本文が間違ってる予感が…直さねば。
  • すずきさん(2006/12/20 20:26)
    間違えた。#はパラメータ展開、文字列連結は##でした。

    #define の中なので、たぶん
    __put_user_x(__r1, __p, __e, 8, "ip", "lr");
    と渡すと、__S は 8 になって、
    "bl __put_user_" #__S

    "bl __put_user_" "8"
    に展開され
    "bl __put_user_8"
    と連結されます。

    $ cat a.c
    #define hoge(a) printf("hoge_" #a "\n");
    int main()
    int a = 1;
    hoge(0);
    hoge(a);
    hoge("fuga");

    return 0;
    とすると

    $ gcc a.c; ./a.out
    hoge_0
    hoge_a
    hoge_"fuga"
    こんな感じになります。
  • ち。さん(2006/12/21 15:24)
    うは。まちがってたw
    コメントはセミコロン`;`でした。
    大変失礼しましたm(_ _)m
  • hdkさん(2006/12/23 00:48)
    ; は複数の命令を一行にまとめて書くときに使う区切り文字です。# がコメントであってます。
  • すずきさん(2006/12/24 04:34)
    えーと、まとめると。

    1: __asm__ __volatile__ (
    2: "bl __put_user_ #__S"
    って書いたら、__S はコメントで、

    今回の奴は
    1: __asm__ __volatile__ (
    2: "bl __put_user_" #__S
    となっていてこれは #define の定義なので、#の後ろにあるパラメータは展開されて文字列として連結される。

    ってことで理解合ってます?>お二方
open/close この記事にコメントする



link もっと前
2006年12月19日 >>> 2006年12月19日
link もっと後

管理用メニュー

link 記事を新規作成

<2006>
<<<12>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20