2016-10-12 15 views
1

リンカースクリプトでは、PROVIDE(__KERNEL_BEGIN__ = .);を定義しました。 (誤ったアドレスを与える)cのリンカースクリプトで変数定義にアクセスする方法は?

extern uint32_t __KERNEL_BEGIN__[]; 

しかし、以下では動作しません:

アドレスからアクセスすることができ

extern uint32_t * __KERNEL_BEGIN__; 

私はアセンブリを見ました。最初の方法、__KERNEL_BEGIN__は、正確なアドレスを提供します。 2番目のアドレスは__KERNEL_BEGIN__ = [address]で、アドレスの値を検索します。

だから、それはこのようにする必要がありますか?違いは分かりません。

答えて

4

extern変数のアドレスを取得する必要があります。それは完全に直感的ではないが、the manualで説明されている。

理論的には、externは任意のプリミティブデータ型にすることができます。私は気づいていない午前理由から、慣例が使用することですchar

printf("Address: %08x\n", &__KERNEL_BEGIN__); 

について、あなたは読むことができます:

extern char __KERNEL_BEGIN__; 

そして、リンカスクリプトからエクスポートしたアドレスを取得するには、__KERNEL_BEGIN__のアドレスを取りますこれはthe manual for ldです。

関連する問題