0

質問が正しく表現されているかどうか、または私がしたいことが可能かどうかはわかりません.

私は既存の GCC アプリケーションを持っています (問題がある場合は Cortex-M3 用にコンパイルされています)。私がやりたいことは、既存のアプリケーションを呼び出すことができる小さな機能 (1 つのメソッド、いくつかのメソッドのみ) を作成することです。

これらのいくつかのメソッドを特定のメモリ位置に配置したいと考えています (その方法は知っています)。どうすればよいかわからないのは、新しいアプリケーションを既存のアプリケーションのオブジェクトとコンパイル/リンクすることです。

たとえば、私の既存のアプリケーションには次の機能があります。

int Add(int a, int b);

そして、新しいアプリケーションはそれを使用したい:

int Calculate(int a, int b, int opType)
{
  Add(a, b);
}

すべてのリンカー、obj、h ファイルなどにアクセスできます。

4

3 に答える 3

4

通常、実行可能ファイルにリンクすることはできません。ライブラリ (静的または共有) とオブジェクト ファイルにのみリンクできます。したがって、私ができる最善のアドバイスは、最初のプログラムの「コア」を共有ライブラリとして構築し、「フロントエンド」( main) をコア共有ライブラリに対して構築された実行可能ファイルとしてリンクすることです。次に、2 番目のプログラムは、共有ライブラリに対してリンクされたプログラムにすることもできます。

またdlopen、動的実行可能ファイルに対して を使用して、実行時に実行可能ファイルをリンクしdlsym、目的の機能の関数ポインタを取得するために使用することもできますが、これは通常、最初の実行可能ファイルを制御できない場合にのみ使用されます。

後者の例 (これは最後の手段であることに注意してください):

交流:

#include <stdio.h>
int main() { printf("hello world!\n"); return 42; }

紀元前:

#include <stdio.h>
#include <dlfcn.h>

main() {
    void *handle = dlopen("a", RTLD_LAZY);
    if(!handle) {
        printf("failed: %s\n", dlerror());
        return -1;
    }
    int (*amain)() = dlsym(handle, "main");
    if(!amain) {
        printf("dlsym failed: %s\n", dlerror());
        return -1;
    }
    return amain();
}
于 2012-09-26T20:57:14.670 に答える
1

ご意見をお寄せいただきありがとうございます。ただし、既存のアプリケーションからの ELF ファイルを使用して新しいアプリケーションをコンパイルすることで、必要なことを正確に行うことができました。
--just-symbols elffile.elf

于 2012-09-27T12:35:08.643 に答える
0

Linux バリアントを使用している場合、dlopen() および dlsym() を使用するための @nneonneo の回答が最適な方法です。

ただし、別のOSを使用している(またはまったく使用していない)、および/またはこのコードを固定の場所に配置する必要があると仮定します(たとえば、実行を特定のメモリデバイスのアドレスにシフトする必要がある場合など)。 . フラッシュ操作を行う場合)、ハードコードされた関数ポインターを使用できます。

次のように関数ポインタを宣言します。


typedef int (*AddFnPtr)(int a, int b);
AddFnPtr MyAddFunction = (AddFnPtr)ADDRESS_OF_YOUR_FUNCTION;

次に、次のように呼び出します。


int Calculate(int a, int b, int opType)
{
  MyAddFunction(a, b);
}

リンカーは、その場所に置いたコードが正しいプロトタイプを持っているかどうか、または存在するかどうかを知る方法がないことに注意してください。したがって、リンク時または実行時にエラーチェックは行われません。

おそらく (OS によっては)、関数をローカル プロセスのアドレス空間に配置した絶対メモリ位置をマップするための手順を実行する必要もあります。

于 2012-09-27T00:54:22.157 に答える