Ticket #21146

初期化データの配置を間違えることがある

Open Date: 2010-03-21 14:26 Last Update: 2010-03-22 22:43

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
Priority:
8
Severity:
5 - Medium
Resolution:
None
File:
None

Details

プログラムの内容によっては、リンク時に初期化データがフラッシュROM(MEM_FLASH)領域ではなく、FIO RAM(MEM_FIO)領域にとられてしまう。その結果、データが正しく初期化できない。

具体的な再現手順を、sample1.c を改造する場合を例に示す。

1. sample1.c の下記の箇所を追加する。

unsigned long long var_ull = 10;    <---- !!!
/*
 *  並列実行されるタスク
 */
void task(VP_INT exinf)
{
	volatile UW	i;
	INT		n = 0;
	INT		tskno = (INT) exinf;
	const char	*graph[] = { "|", "  +", "    *" };
	char		c;

var_ull /= 3;                      <---- !!!
	ena_tex();
	while (1) {

2. make 後、idata_start, idata_endのシンボルの値を確認する。次のようにMEM_FIOの領域に配置されていることが確認できる。

  $ make
  $ grep __idata jsp.syms
  3fff8010 A __idata_end
  3fff8008 A __idata_start
  $

3. 追加した除算の行を削除すれば、同シンボルはMEM_FLASH領域に配置される。   この例に示した unsigned long long 除算以外のコードでも問題が発生するかどうかについては、未調査のため不明である。

Ticket History (3/5 Histories)

2010-03-21 14:26 Updated by: sirius506
  • New Ticket "初期化データの配置を間違えることがある" created
2010-03-21 23:32 Updated by: suikan
Comment

Ubunt 9.04, Sourcery G++ lite 2009Q1環境で上記sample1改造プログラムによる現象の再現を確認しました。

arm-none-eabi-readelf -a jsp の結果を見ると、.ARM.exidxという見慣れない出力セクション名があり、どうもそれが.dataセクションの配置を引きずっているのではないかと思える節があります(根拠は薄い)。.ARM.exidxはC++例外処理用のindexですが、例外は使っておらず、なぜこのセクションが現れたかは、不明です。もう少し追求が必要です。

2010-03-21 23:47 Updated by: suikan
Comment

ねむいさんのブログを参考にして、lpc2388.ld ファイルに以下の一節を追加してみました。手元では問題が消えたようです。

	__exidx_start = .;
	.ARM.exidx : {
		 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 
	} > MEM_FLASH

.rodata 出力セクションの宣言の直後に挿入するのが適切と思われます。修正前は

    _etext = .	;
    PROVIDE (etext = .)	;
    .rodata : { 
	*(.rodata) 
	*(.rodata.str1.4) 
    } > MEM_FLASH

となっているのを、次のように修正します。

    _etext = .	;
    PROVIDE (etext = .)	;
    .rodata : { 
	*(.rodata) 
	*(.rodata.str1.4) 
    } > MEM_FLASH

    __exidx_start = .;
    .ARM.exidx : {
	 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 
    } > MEM_FLASH

確認をお願いします。

2010-03-22 19:18 Updated by: sirius506
Comment

Ubuntu 9.10, Sourcery G++ lite 2009Q3環境で、上記のリンカスクリプト変更により問題が解決されることを確認しました。

2010-03-22 22:43 Updated by: suikan
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2010-03-22 22:43

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login