web-dev-qa-db-ja.com

スタンドアロンの静的実行可能ファイルをコンパイルする

ダイナミックローダーを使用しない実行可能ファイル(ELFファイル)をコンパイルしようとしています。 Linuxからmipsをコンパイルして、作成したシミュレーターで使用できるクロスコンパイラーを作成しました。私のhello.cppファイル(hello worldプログラム)のコンパイル時にフラグ-static-libgccをアサートしました。どうやらこれは十分ではありません。ダイナミックローダーの名前/パスを含むセグメントが実行可能ファイルにまだあるからです。実行する必要があるすべてのものを含む実行可能ファイルを生成するには、どのフラグを使用しますか?クロスコンパイラを再構築する必要がありますか?

34
Dan Snyder

-staticフラグを使用してみますか?

21
sigjuice

リンクには次のフラグを使用します

-static -static-libgcc -static-libstdc++

これらの3つのフラグを使用して、すべての依存関係の静的バージョン(gccを想定)に対してリンクします。特定の状況では、3つすべてのフラグが必ずしも必要ではないことに注意してください。ただし、これらのフラグも「痛まない」わけではありません。したがって、3つすべてをオンにします。

実際に機能したかどうかを確認する

  1. 動的リンクが実際にないことを確認してください

    ldd yourexecutable
    

    「動的実行可能ファイルではない」または同等のものを返す必要があります。

  2. 未解決のシンボルが残っていないことを確認してください

    nm yourexecutable | grep " U "
    

    リストは空であるか、次のような特別なカーネルスペースシンボルのみが含まれている必要があります

    U __tls_get_addr
    
  3. 最後に、実際に実行可能ファイルを実行できるかどうかを確認します

98