2017-04-13 6 views
1

私は同じターゲット上で実行されている2つの異なるプロジェクトを持っています。 私の2番目のプロジェクトでは、特定のアドレスで最初のプロジェクトで書かれた機能をほとんど使用しません。Cでプロジェクト間で関数のシンボルとアドレスを共有するには?

これを行うには、2番目のプロジェクトのシンボルテーブルを使用できると思っていましたが、動作しません。 (私はシンボルテーブルを生成するために、arm-none-eabiツールチェーンと.elfファイルに-nmを使用します)。

私はそれが可能であることは知っていますが、どうすればいいですか?

+1

* ...でも動作しません... *問題点を完全に説明しています。 –

+0

私はあなたがCortex-Mを使用していると仮定しようとしています。それはCooCoxがサポートしているものです。最も有用なタグではなく、ターゲット情報は開発プラットフォームよりも有用です。 – Clifford

+0

コールを行うコード(動作しないコード)を表示し、使用されているアドレスを示し、ターゲットプラットフォームにタグを付けます。あなたはより速く、より正確で、より関連性の高い答えを得るでしょう。 – Clifford

答えて

1

まあ、強引なアプローチであろう可能性が非常に高い作品:つまり

int (*far_function)(int a, int b, int c) = (int(*)(int, int, int)) 0xfeedf00d; 

far_function(1, 2, 3); 

、単に関数ポインタを作成し、既知のアドレスを使用してそれを初期化します。

アドレスがよく知られていない場合(他のアプリケーションが再構築され、ターゲット機能を特定のアドレスに「ロック」する手順を実行していない場合)、私は代わりにポインタを含む固定アドレスにメタデータを追加します。他のアプリケーションはこのデータを埋め込み、それによって興味深い機能の位置を「エクスポート」する。

+0

'0xfeedf00d'は面白かったのか、奇数なのか、それは有効なARM-Thumb2分岐アドレスなのですか? ;-) – Clifford

+0

@Clifford主に前者は、それが奇妙であると不平を言ってThumb2の防衛を準備していると思った。 :) OPのプラットフォームを知らなかった。 – unwind

+0

@unwindは素早く答えてくれてありがとう、私の期待通りに動作するようです。私のプラットフォームはCortex-M3(STM32L151) – LOSwy

0

nmで得られるアドレスはシンボルの位置ですが、Thumb2命令セットを使用したCortex-Mではジャンプ/呼び出し/分岐実行に直接使用することはできません。アドレスをThumbモードを示す1に設定します。例えば

:それはそれはに建てられたこのプロジェクトのこと、呼び出し元の環境にない実行されているので、

typedef void (*voidFn_void_t)(void) ; 

uint32_t symbol_address = symbolLookup("myfunction") ; 

symbol_address |= 1 ;    // Make Thumb mode address 
((voidFn_void_t)symbol_address)() ; // Make call 

と呼ばれる機能がその後も実行環境に依存関係を持っていない必要がありますがあります。実行環境が同一であってもそれを維持することが問題である場合は、それを取り除くこと。

関連する問題