1

RTEMS 4.9.2現在、NFS サーバーを .NET で実行されているコードに統合しようとしていますPOWER PC 5200。これを簡潔に説明するのは難しいので、我慢してください。

RTEMS NFS

現在、RTEMS は nfs.c ファイルを介して NFS クライアントを実装しています。コマンド ライン インターフェースを有効にしてmount -t nfs ...オプションを使用できるようにするには、設定ファイルに追加#define CONFIGURE_SHELL_MOUNT_NFSし、rtems nfs ファイルを とリンクする必要があります-lnfs。詳しくはこちらをご覧ください。これを正しく行うと、RTEMS nfs クライアントを実装でき、コマンド ラインからリモート ドライブをマウントできます。

RTEMS NFS クライアントを直接使用する

私たちのプログラムでは RTEMS コマンド ラインを公開していないので、nfs インターフェイスを直接使用できるようにしたいと考えています。RTEMS ライブラリにはlibrtemsNfs.h、nfs クライアントを実装するための関数が含まれています。これらの関数の実装はnfs.c、2 つのライブラリのうちの 1 つを作成するためにコンパイルされたものです。

  1. libnfs.a
  2. nfs.rel

ビルドには両方が必要です。コードの一部として、nfsInit(...で宣言されlibrtemsNfs.h、 で定義されている関数を使用していますnfs.c

エラー

したがって、エラーはかなり明白です。ビルドすると、リンカー エラーが発生します。

D:\Git\nfs_stuff\Src\RTEMS_proj/init/srvinit.cpp:453: undefined reference to `nfsInit(int, int)'
collect2: ld returned 1 exit status

これらのライブラリをリンクしようとしています

これらをリンクするために、複数の方法を試しました。しかし、これをmakefile誰にとっても簡単にするために、コマンドラインビルドで何が得られるかを示します. 私たちは試しました:


  1. 推奨される方法は、 -lnfs ( source - an old question ) とリンクすることです。これにより、長くて複雑なビルド コマンドが生成されます。

powerpc-rtems4.9-g++ -g -Wall -g -mcpu=603e -mstrict-align -meabi -msdata -fno-common ... -MANY_PREPROCESSOR_ARGUMENTS ... -MANY_INCLUDE_FILES ... Map=./exe/srvevp. map -lc -lm --gc-sections -lnfs -mcpu=603e -mstrict-align -meabi ... -MANY_OBJECT_FILES ... ./exe/obj/srvinit.o ... -MANY_MORE_OBJECT_FILES

コンパイルおよびリンク コマンドには-lnfs、問題のあるオブジェクト ファイル ( srvinit.o) を含める前に があります。しかし、まだリンカー エラーが発生します。


  1. .aand.relファイルに直接パスでリンクしようとしました。/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.relこれを行うには、コマンド ラインに次を追加します。問題のあるオブジェクト ファイルの前後に追加しました。-Lパスによるリンクを強制するコマンドも試しました。これはすべて同じエラーになります。

その他の情報

これを説明するのは難しいですが、libnfs.aファイルの直接リンクを削除すると、nfs を直接使用しなくてもビルドできなくなります。すなわち。内部 RTEMS ファイルは相互にリンクできません。これは非常に奇妙です。コマンドラインオプションをビルドするだけでよいように思え-lnfsますが、このフラグがなくても正常にビルドされます。直接インクルードしないと、次のエラーが発生します。

c:/rtems-4.9/powerpc-rtems4.9/5200/lib\librtemscpu.a(libshell_a-main_mount_nfs.o): In function `rtems_shell_nfs_mounter':
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\adept_5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:46: undefined reference to `rpcUdpInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:51: undefined reference to `nfsInit'
e:\CCNET\rtems-4.9\Trunk\build_5200\powerpc-rtems4.9\c\5200\cpukit\libmisc/../../../../../../rtems-4.9.2/c/src/../../cpukit/libmisc/shell/main_mount_nfs.c:58: undefined reference to `nfsMount'
collect2: ld returned 1 exit status

リンクに失敗する rtems シェル コードはどれですか。/c/rtems-4.9/powerpc-rtems4.9/5200/lib/libnfs.a /c/rtems-4.9/powerpc-rtems4.9/5200/lib/nfs.relをビルド行の最後に追加すると、すべてが成功します。

繰り返しますが、nfs.a.relファイルを直接含める必要があるコマンド ライン関数を構築するには、 -lnfs.

質問

したがって、最初の最も明白な質問は、ライブラリファイルを明示的に指定した場合でも、なぜこれがリンクしないのですか? これについての私の考えは、おそらくファイルには、使用しようとしている関数の定義が含まれていないということです。しかし、RTEMS OS自体の機能をリンクする必要があるため、これは他の情報セクションで信用されていません。

PCやすべてのコンパイラがインストールされていないと再現できないため、これも直接的な答えを出すのが難しいことはわかっています.libファイルに関数の定義が含まれており、リンクされていることを確認するにはどうすればよいですか正しい順序で?このコンパイラは、RTEMS が Power PC 5200 用に提供する BSP 固有GCCのスタイル コンパイラです。GCC/G++ 4.2 が受け入れるほとんどのコンパイラ オプションを受け入れます。

最後に、このようなリンカの問題をデバッグするための良い方法はありますか? .

4

2 に答える 2

1

RTEMS 4.9.2 ライブラリ コードは、C++ コンパイラとリンクする準備が整っていないため、異なる ABI を持っています。

ライブラリ定義に extern "C" {} ブロックを使用するには、librtemsNfs.h を変更する必要があります。

または、RTEMS ソース コードを変更したくない場合は、これらの関数を次のようにコード内で直接宣言します。

extern "C" {
   int rpcUdpInit(void);
   int nfsInit(int smallPoolDepth, int bigPoolDepth);
   int nfsMount(char *uidhost, char *path, char *mntpoint);
}
于 2016-02-03T13:43:54.423 に答える