Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++IDERAD Studio

リンカの支援:C++Builder 10.4.2でのDWARFとリンカのメモリ使用量の分割

close up lumberjack chopping wood with ax sawdust fly to sides harvesting wood

リンカは、C++Builderツールチェーンの中核をなす大切なパートです。結局のところ、リンカはコンパイラの出力を纏めて最終的なバイナリを作成する部分であり、その重要性は計り知れません。ただし、アプリケーション全体を一度にまとめるため、多くのメモリを使用することになります。

C++Builder 10.4.2は、リンカの改善を行った最初のリリースではありません。

まずC++Builder 10.2で、リンカの大きなアドレス処理(large address aware)の対応から始まり、今日の典型的なアプリケーションに合わせてリンカを調整し、リンカがメモリ不足のエラーを発生し、ユーザーのアプリケーションのプロジェクトに対応できない場合には、リンカのヒープサイズ調整をするための有用な情報をドキュメント化しています。(リンク時にクラシックオブジェクトとclangオブジェクトの混合を検出するなどの便利な機能を追加することは言うまでもありません。これは、アプリケーションのランタイムの安定性に影響を与える目に見えない問題を見つけるのに役立ちます。例えば、アプリケーションによくあるミスが含まれていないか、安定しているかを確認するために使用します)

C++Builder 10.4.2では、「Split DWARF」と呼ばれるWin64リンカの大幅な改善が行われました。これは、Unixの世界からWindowsに導入されたものです。

なぜ変な名前なの?

オブジェクトファイル(各コンパイルユニットのコンパイル済み形式、つまり各.cppファイル)は、さまざまなオブジェクトのフォーマットで保存されます。 C++BuilderのWin64では、64ビットELFを使用します。これは通常、Linuxで使用されるフォーマットです。「ELF」とは、Executable and Linkable Formatの略ですが、名前の起源は諸説ありますが、「ホビットの冒険」や「指輪物語」の著者として知られているトールキンのファンではないかと思われます。(このPDFの2ページ目をご覧ください)

Split DWARFは、D&D tavern fightCalvino novelから生まれたものではありません。実際には、デバッグ情報を分割して、リンカが処理しなくても済むようにする方法です。

さて、アプリケーションをリンクする際にリンカが必要とするメモリの量を減らすためには、どうすれば良いでしょうか?

その答えは極めてシンプルな話で、 リンクするファイル数やサイズを減らすことです。

デバッグ情報の分割

通常、アプリケーションをデバッグモードでビルドする場合、またはデバッグ情報がオンになっているユニットを使用する場合、デバッグ情報はコンパイルされたコードとともにオブジェクトファイルに含まれます。 そしてリンカはその両方を読み込んで最終的なバイナリを作成します。デバッグモードでビルドされたEXEやDLLには、コンパイルされたコードとデバッグ情報の両方が含まれています。これがデバッグ用EXEが通常のリリースモードのアプリケーションに比べてファイルサイズが非常に大きくなる主な理由です。

Split DWARFは、オブジェクトファイルを処理し、デバッグ情報を並べて配置された.dwoファイルである独自のファイルに分割します。元のオブジェクトファイルには小さなスタブが残り、デバッガがデバッグ情報の場所を探すために読み込みます。

Split DWARFを有効にするためには、C++BuilderのターゲットプラットフォームがWindows64ビットターゲットに設定されていることを確認し、プロジェクトのオプションダイアログを開き、 [ビルド]- [C ++コンパイラ]-[デバッグ]に移動します。

helping the linker split dwarf and linker memory usage in cbuilder 10 4 2 ja 1321232

[Split Dwarfを使用]にチェック入れると、機能が有効になります。

オプションを展開(>キャレットをクリック)すると、「DWO 出力ディレクトリ」の設定ができます。

helping the linker split dwarf and linker memory usage in cbuilder 10 4 2 ja 2 8020624

この設定はデバッグ情報ファイルを保存するフォルダを指定できます。相対パスや環境変数を使用したパスではなく、絶対パスである必要があります。(例えば 、c:〜あるいはd:〜で始まるパスです。 これはデバッガがデバッグ情報を確実に検出できるようにするために必要です。)

詳細については、こちらのドキュメントをご覧ください。C++Builder 10.4.2でリンカのリンク作業を大幅に軽減した、優れた新しいWin64デバッガーを使用できます。(C++Builder 10.4では、STL型の検査などの素晴らしい機能を備えています。このブログ以降、さらに多くの機能が追加されています)

今すぐ10.4.2を使い始めよう

すでに、10.4.2のトライアル版が利用可能になっており、今後製品を購入いただくと、10.4.2をダウンロードいただけるようになります。また、すでに製品をお持ちの方は、有効なアップデートサブスクリプションがあれば、既存のライセンスを使用してRAD Studio 10.4.2をご利用いただけます。10.4.2のダウンロードは、新しいカスタマーポータルサイト(my.embarcadero.com)から行えます。

詳細については、以下の情報をご確認ください。

エンバカデロでは、10.4.2において行った作業について大きな成果を上げることができたと考えており、皆さんがこの新しいリリースをご活用いただけるものと期待しています。


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

IN THE ARTICLES