問題タブ [lld]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - (clang / llvm-mc / lld) hello world (x86-64 Windows & Linux)
llvm は、llvm-mc と lld を使用して、Windows や Linux で x86-64 コードをコンパイル、アセンブル、およびリンクできますか?
もしそうなら、そこにハローワールドレベルの例はありますか? 現在、ドキュメントはかなりまばらです。
トランク LLVM (clang & lld を使用) を使用して、単純な Hello World (main0.cpp) を構築しようとしました。
main0.cpp:
コンパイル (エラーなし):
組み立てる (エラーなし):
リンク (ここで失敗します! ):
リンク エラー:
リンカ コマンドをclang -o main0.run main0.cpp -###
( に置き換えld
て[MY-LLVM]/lld -flavor gnu
) 取得しました。
アセンブル時に間違ったタイプのオブジェクト ファイルを生成しているか、リンク時に間違ったパラメータを使用していると思います。
誰もこれを正しく行う方法を知っていますか?
(私の最終的な目標は、完全な C++14 を win64 で (大規模なハックなしで) 動作させることですが、トランクの clang を mingw ツールで動作させるのに苦労しているので、純粋な LLVM を試してみようと思いました)。
c++ - 順序に関係なく、clang を使用して静的ライブラリをリンクする
-Wl,--start-group
GCC では、リンカー フラグを使用して、-Wl,--end-group
循環依存関係を持つライブラリとのリンクの問題を解決できます。clang でも同じことをしたいのですが、この機能はlld バージョン 3.2 で削除されたようです。どうすればいいのですか?
linker - lld リンカは ld と gold のドロップイン代替品ですか?
LLVM プロジェクト のリンカlld
は現在、毎週新しい機能が追加されて開発されています。その開発者は、それlld
が よりも速いと約束していますld
。と比較してどのように競合しgold
ますか?
lld は のドロップイン代替品ld
ですか? ゴールドには、ジャンプするためのいくつかのフープがあります。
linker - テキスト セグメントの最小開始アドレスを指定します
特定の位置またはそれより上にコードを配置するように lld に指示するにはどうすればよいですか?
かなり疑わしいロジックに依存する従来のコードがあります。特定の関数は、関数ポインターの配列へのインデックスを表す値、または実際には関数ポインターである値を受け取ることができます。この関数は、値が より小さいかどうかをチェックして、値の型を決定します0x10000
。もしそうなら、それはインデックスです。そうでない場合は、関数ポインターです。
どうしてもやりたいのですが、このコードを変更することはできません。
残念ながら、このテストは機能しません。OSX では (他の場所ではまだ問題として現れていません)、プログラム内の関数ポインターは、そのしきい値よりもはるかに低いアドレスを持つことができます。つまり、問題の関数がそれらを検出することを意味します。ポインターではなくインデックスとして、すべてがうまくいかない。
0x10000
誰かがばかげたテストを修正できるまでこの問題がなくなるように、生成されたすべてのコードを上または上に配置するようにリンカーに強制する指示がありますか (この場合は lld) 。
オプションを試しました-sectalign
が、次のエラーが発生します。
ld: -sectalign の引数は 0x8000 以下である必要があります
0x8000
十分ではありません。コードはまだそれとの間のスペースに配置されて0x10000
おり、ロジックはまだ失敗しています。
これを行うために使用できる別のオプションはありますか?
clang - LLVM コンパイル プロセスと LLD
「ソフトウェア開発」シーン全体にもっと関わりたいので、LLVM に切り替えようとしてきましたが、今のところ LLVM が未来のようです。GNU/GCC と LLVM/Clang の両方を使用して、ソースから LLVM/Clang/LLD/compiler-rt/libcxx を数回ビルドしました。
新しくコンパイルされたコンパイラを使用しようとすると、問題が発生します。私が見る限りclang
、LLVM ではなく GNU ld を使用していますlld
。これは本当ですか?
LLD は、出力からは非常に限定されたプログラムのように見えますlld -help
が、私が読んだ限りでは、ld
. 使用方法に関するドキュメントがどこにも見つかりません。包括的なマニュアルがどこにあるか知っている人はいますか?
ありがとうございました。
c - 不正な形式の実行可能ファイルを生成する実験的なツールチェーンをデバッグする方法
clang
(代わりにgcc
)、compiler-rt
(代わりにlibgcc
)、 ( http://llvm.org/git/libunwind.gitlibunwind
で入手可能) (代わりに)、(GNU の代わりに)を使用して、実験的な GNU フリー Linux ツールチェーンのクロスコンパイルに取り組んでいます。 、(の代わりに)、(確信が持てない代わりに、 とそのABIのGNUの違いについては不明です)および(の代わりに)。libgcc_s
lld
ld
libcxx
libstdc++
libcxxabi
libstdc++
musl
glibc
musl
ベースのgcc
クロス コンパイラといくつかのパッチを使用して、上記のすべてを正常にコンパイルし、単純な hello world C プログラムを正常にコンパイルしてリンクすることができました。ただし、hello world プログラムを実行するとセグメンテーション違反が発生するため、何か問題が発生したようです。
通常は gdb でデバッグするだけですが、ここに問題があります。
C ランタイムの起動の初期段階でエラーが発生しているため、プログラムをステップ実行できないようです。layout asm
andを使用してアセンブリをステップ実行することさえできないstepi
ため、エラーが発生している正確な場所を特定する方法がわかりません (ツールチェーンをデバッグするため)。
lld
GNU binutilsld
を使用して、クロス コンパイルされたライブラリとオブジェクト ファイルを使用して hello world オブジェクトを (静的に) 正常にリンクし、機能的な hello world プログラムを作成することで、問題が存在することを確認しました。ただし、リンクは成功しているためlld
、どこで障害が発生しているのかを特定することはできません。
注:hello
静的実行可能ファイルとしてコンパイルし、-v
gcc
/clang
オプションを使用して、すべての正しいライブラリとオブジェクト ファイルがリンクされていることを確認しました。
オンラインの GDB ドキュメントには、上記のエラーについて次のように記載されていることに注意してください。
Unix システムでは、デフォルトで、ターゲットでシェルが使用可能な場合、gdb) はそれを使用してプログラムを開始します。run コマンドの引数はシェルに渡され、シェルは変数置換を行い、ワイルドカード文字を展開し、I/O のリダイレクトを実行します。状況によっては、シェル自体をデバッグするときや、次のような起動エラーを診断するときなど、シェルのそのような使用を無効にすることが役立つ場合があります。
これは、プログラムではなく、「exec-wrapper」で指定されたシェルまたはラッパーがクラッシュしたことを示しています。
私が取り組んでいることと、 GNU を使用すると問題が発生しないことld
、および提案された解決策 ( set startup-with-shell off
) が機能しないことを考えると、これは真実ではないと思います。