カーネルライブラリを指定するとリンクに失敗する
システム依存部のMakefile.dependか、LDスクリプトの記述に何らかの問題があると思われる。
CQ_FRK_NXP_ARMで問題再現を確認。一方でIntegrator(配布そのまま)では問題は起きない。chip_mmr.oの名前はMakefile.dependで参照されているほか、LDスクリプトでも参照されているのでそちらの問題も視野に入れて取り組むべき。
ビルドが通らないのはldファイルの中でオブジェクトの名前を直接指定しているためである。
報告されている構成例の場合、jsp/config/armv4/_common_lpc2388/lpc2388.ld ファイルの中の"chip_mmr.o"を、すべて"../KERNEL/libkernel.a"に変更すると、ビルドは通るようになる。しかし、こうするとレジスタ名が変数として使えなくなる。さらなる調査が必要である。
LDスクリプトの中で、レジスタに相当する変数の為のインプット・セクション指定をしている。そのセクションのソースとしてファイル名を指定するのだが、ファイル名の指定のしかたで結果が異なる。
理由は不明である。リンカのバグである可能性もあるが、その他の条件の組み合わせが多いことなどから、これ以上の調査は困難に思える。
追記。
上のコメントで論じているのは、lpc2388.ldの以下の部分である。
.bss.firmmr (NOLOAD) : { chip_mmr.o(.MMR0)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4000; chip_mmr.o(.MMR1)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4010; chip_mmr.o(.MMR2)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4030; chip_mmr.o(.MMR3)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4050; chip_mmr.o(.MMR4)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4070; chip_mmr.o(.MMR5)} > MEM_FIO .bss.firmmr (NOLOAD) : { . = 0x4090; chip_mmr.o(.MMR6)} > MEM_FIO
ここで、chip_mmr.oの部分を書き換えると、結果が変わる。場合によってはコンパイルエラーが発生し、場合によってはデバッガ用の変数情報が消える。
これまでのところ有効な解決策が見つかっていない。 また、カーネルライブラリを作らないという回避策があるため、有効な解決策が見つかるまで優先順位を下げることにする。
Makefileにてカーネルライブラリ(KERNEL_LIB)を指定すると、リンク時にエラーとなってしまう。具体的な再現手順を以下に示します。