Ticket #20704

カーネルライブラリを指定するとリンクに失敗する

Date d'ouverture: 2010-02-18 00:50 Dernière mise à jour: 2010-03-27 16:07

Rapporteur:
Propriétaire:
(Aucun)
Type:
État:
Ouvert
Priorité:
1 - le plus bas
Sévérité:
5 - moyen
Résolution:
Postponed
Fichier:
Aucun

Détails

Makefileにてカーネルライブラリ(KERNEL_LIB)を指定すると、リンク時にエラーとなってしまう。具体的な再現手順を以下に示します。

$ mkdir KERNEL
$ cd KERNEL
$ ../jsp/configure -C armv4 -S cq_frk_nxp_arm
...
$ make depend
...
$ make libkernel.a
...
$ cd ..
$ mkdir sample1
$ cd sample1
$ ../jsp/configure -C armv4 -S cq_frk_nxp_arm -L ../KERNEL
...
$ make depend
...
$ make
....
arm-none-eabi-gcc  -mcpu=arm9tdmi  -mlittle-endian     -O2 -g  -DGDB_STUB -I. -I../jsp/include  -I../jsp/config/armv4/cq_frk_nxp_arm -I../jsp/config/armv4/_common_lpc2388 -I../jsp/pdic/simple_sio -I../jsp/config/armv4 -nostdlib  -mcpu=arm9tdmi  -N  -mlittle-endian  -T ../jsp/config/armv4/_common_lpc2388/lpc2388.ld -o jsp \
			start.o  sample1.o     timer.o serial.o logtask.o log_output.o vasyslog.o t_perror.o strerror.o  kernel_cfg.o   ../KERNEL/libkernel.a   -lgcc 
/opt/arm-2009q3/bin/../lib/gcc/arm-none-eabi/4.4.1/../../../../arm-none-eabi/bin/ld: cannot find chip_mmr.o
collect2: ld returned 1 exit status
make: *** [jsp] エラー 1
$ 

Ticket History (3/10 Histories)

2010-02-18 00:50 Updated by: sirius506
  • New Ticket "カーネルライブラリを指定するとリンクに失敗する" created
2010-02-20 22:57 Updated by: suikan
  • Propriétaire Update from (Aucun) to suikan
Commentaire

システム依存部のMakefile.dependか、LDスクリプトの記述に何らかの問題があると思われる。

2010-02-21 09:38 Updated by: suikan
Commentaire

CQ_FRK_NXP_ARMで問題再現を確認。一方でIntegrator(配布そのまま)では問題は起きない。chip_mmr.oの名前はMakefile.dependで参照されているほか、LDスクリプトでも参照されているのでそちらの問題も視野に入れて取り組むべき。

2010-02-21 10:16 Updated by: suikan
2010-02-21 10:31 Updated by: suikan
  • Composant Update from (Aucun) to toppersjsp4lpc Release 1.0.2
2010-03-09 22:21 Updated by: suikan
Commentaire

ビルドが通らないのはldファイルの中でオブジェクトの名前を直接指定しているためである。

報告されている構成例の場合、jsp/config/armv4/_common_lpc2388/lpc2388.ld ファイルの中の"chip_mmr.o"を、すべて"../KERNEL/libkernel.a"に変更すると、ビルドは通るようになる。しかし、こうするとレジスタ名が変数として使えなくなる。さらなる調査が必要である。

2010-03-11 22:13 Updated by: suikan
  • Propriétaire Update from suikan to (Aucun)
Commentaire

LDスクリプトの中で、レジスタに相当する変数の為のインプット・セクション指定をしている。そのセクションのソースとしてファイル名を指定するのだが、ファイル名の指定のしかたで結果が異なる。

  • chip_mmr.o : 変数名が保存され、デバッガから見える。
  • libkernel.a : 変数名が消え、デバッガから見えない。
  • *.o : 変数名が消え、デバッガから見えない。
  • * : 変数名が消え、デバッガから見えない。

理由は不明である。リンカのバグである可能性もあるが、その他の条件の組み合わせが多いことなどから、これ以上の調査は困難に思える。

2010-03-14 21:38 Updated by: suikan
Commentaire

追記。

上のコメントで論じているのは、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の部分を書き換えると、結果が変わる。場合によってはコンパイルエラーが発生し、場合によってはデバッガ用の変数情報が消える。

2010-03-27 16:07 Updated by: suikan
  • Priorité Update from 5 - moyen to 1 - le plus bas
  • Résolution Update from Aucun to Postponed
Commentaire

これまでのところ有効な解決策が見つかっていない。 また、カーネルライブラリを作らないという回避策があるため、有効な解決策が見つかるまで優先順位を下げることにする。

2010-03-29 09:01 Updated by: None

Attachment File List

No attachments

Modifier

Please login to add comment to this ticket » Connexion