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 プログラムを実行するとセグメンテーション違反が発生するため、何か問題が発生したようです。
$ ./hello
Segmentation fault
$
通常は gdb でデバッグするだけですが、ここに問題があります。
$ gdb ./hello
Reading symbols from ./hello...Dwarf Error: Could not find abbrev number 5 in CU at offset 0x52 [in module /home/main/code/main/asm/hello]
(no debugging symbols found)...done.
(gdb) start
Temporary breakpoint 1 at 0x206
Starting program: /hello
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb)
C ランタイムの起動の初期段階でエラーが発生しているため、プログラムをステップ実行できないようです。layout asm
andを使用してアセンブリをステップ実行することさえできないstepi
ため、エラーが発生している正確な場所を特定する方法がわかりません (ツールチェーンをデバッグするため)。
lld
GNU binutilsld
を使用して、クロス コンパイルされたライブラリとオブジェクト ファイルを使用して hello world オブジェクトを (静的に) 正常にリンクし、機能的な hello world プログラムを作成することで、問題が存在することを確認しました。ただし、リンクは成功しているためlld
、どこで障害が発生しているのかを特定することはできません。
注:hello
静的実行可能ファイルとしてコンパイルし、-v
gcc
/clang
オプションを使用して、すべての正しいライブラリとオブジェクト ファイルがリンクされていることを確認しました。
オンラインの GDB ドキュメントには、上記のエラーについて次のように記載されていることに注意してください。
Unix システムでは、デフォルトで、ターゲットでシェルが使用可能な場合、gdb) はそれを使用してプログラムを開始します。run コマンドの引数はシェルに渡され、シェルは変数置換を行い、ワイルドカード文字を展開し、I/O のリダイレクトを実行します。状況によっては、シェル自体をデバッグするときや、次のような起動エラーを診断するときなど、シェルのそのような使用を無効にすることが役立つ場合があります。
(gdb) run
Starting program: ./a.out
During startup program terminated with signal SIGSEGV, Segmentation fault.
これは、プログラムではなく、「exec-wrapper」で指定されたシェルまたはラッパーがクラッシュしたことを示しています。
私が取り組んでいることと、 GNU を使用すると問題が発生しないことld
、および提案された解決策 ( set startup-with-shell off
) が機能しないことを考えると、これは真実ではないと思います。