リンカ コマンド スクリプトで定義されたリンカ シンボル (__BASE_ADDR と呼びましょう) があります。これには、使用する必要があるロングワードの後にロングワードのアドレスが含まれています (たとえば、アドレス 0x0000000C でロングワードをチェックする必要があり、__BASE_ADDR は 0x00000010 に等しい) )。そのため、コードでは __BASE_ADDR を使用し、そこから 4 を引いて 0x0000000C にアクセスしようとしています。
私のリンカ マップ出力は、__BASE_ADDR の値が 0x00000010 であることを正しく示しています。ただし、次の C コードを使用してその場所にアクセスしようとすると、機能しません。
extern unsigned char *__BASE_ADDR;
void someFunc( void )
{
unsigned long Val = *((unsigned long *) (__BASE_ADDR - 4));
/* Use Val for some comparison...*/
/* ... */
}
Val が間違った値に設定されます。起こっているように見えるのは、__BASE_ADDR にあるロングワードがアドレスとして取得され、4 が減算され、結果のアドレスの内容が Val に入れられるということです。
しかし、次のようにすると、問題なく動作し、Val はアドレス 0x0000000C にあるものに正しく設定されます。
extern unsigned char __BASE_ADDR[];
void someFunc( void )
{
unsigned long Val = *((unsigned long *) (__BASE_ADDR - 4));
/* Use Val for some comparison...*/
/* ... */
}
誰でもこれに光を当てることができますか?リンカー シンボルのコンテンツにアクセスできない (技術的にはコンテンツがない) 理由は理解できますが、リンカー シンボルをポインターとしてアクセスする場合と配列としてアクセスする場合に違いがあるのはなぜですか?
ありがとう。