0

Eclipse を使用してベアメタル アプリケーションを開発しています。私は newlib にリンクしているので、_sbrk() の独自の実装を提供しました。この機能は通常、私のプロジェクトに含まれており、すべてうまく機能していました。

ここで、この関数を、過去数か月にわたって開発した静的ライブラリに移動しようとしています。

リンク中にundefined reference to _sbrkエラーが発生します。ファイルが配置されているパスは、Eclipse 設定に正しく含まれています (同じディレクトリ内の他のファイルは正しくリンクされています)。

明らかに、リンカーがコードを通過する順序に問題があり、この関数は破棄されます。

使ってみ__attribute__((used))ましたが、運が悪かったです。

Eclipse の設定を使用して、この問題を解決するにはどうすればよいですか? (Makefile ベースまたはコマンド ライン コンパイルは、私が必要とするソリューションではありません)。

4

2 に答える 2

1

繰り返しライブラリ

これを機能させるには、リンカーへのコマンド ラインで「新しい」スタティック ライブラリが newlib (C ライブラリ) の後に表示されるようにする必要があります。-lcGCC は、他のすべてのオブジェクトとライブラリの後にリンカーのコマンド ラインに自動的に追加します。ただし、必要に応じて繰り返すことができます。

したがって、ライブラリが呼び出されmylibrary、アプリケーションとメイン ファイルが SO と呼ばれると仮定すると、リンカー オプションを次のように設定すると機能します。

gcc  -o SO ./src/SO.o -lc -lmylibrary

これは、リンカーでこれに解決されます (単純化されています!):

ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc

設定では、これは次のようになります。

ライブラリ設定

適切な組み合わせを得るには、多少調整/追加を繰り返す必要がある場合があります。特に、「mylibrary」が newlib の他の部分に依存し、それがさらに mylibrary の他の部分に依存している場合。

早期リンクの強制

もう 1 つの方法は、_sbrk簡単に早期にリンクされるようにすることです。これは、いくつかの方法で行うことができます。

  • リンカー スクリプトに依存関係を追加する
  • _sbrkGCC に直接渡されるオブジェクト ファイルからの使用を追加します。例えば:
    • _sbrkそれ自体が使用されていない extern (つまり、最適化されていない) 関数からの呼び出し
    • _sbrkacファイルのアドレスを取る
    • アセンブリ ファイルへの参照を追加_sbrkします。おそらく、スペースが狭い場合にターゲットに到達しないセクションにします

なんで?

なぜこれが起こるのかを尋ねていませんでしたが、知りたい他の読者のために、ここに良いQ&Aがあります:ライブラリがリンクされている順序がGCCでエラーを引き起こすことがあるのはなぜですか? 順序が重要な理由の詳細については。

于 2016-03-04T19:30:18.700 に答える
1

次のコードをリンカースクリプトに追加するだけで、問題を解決しました。

GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )

この方法では、どの設定でも必要に応じて変更したり、リンカー コマンドを発行したりする必要はありません。

于 2016-03-06T16:56:31.227 に答える