4

clang(代わりにgcc)、compiler-rt(代わりにlibgcc)、 ( http://llvm.org/git/libunwind.gitlibunwindで入手可能) (代わりに)、(GNU の代わりに)を使用して、実験的な GNU フリー Linux ツールチェーンのクロスコンパイルに取り組んでいます。 、(の代わりに)、(確信が持てない代わりに、 とそのABIのGNUの違いについては不明です)および(の代わりに)。libgcc_slldldlibcxxlibstdc++libcxxabilibstdc++muslglibc

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 asmandを使用してアセンブリをステップ実行することさえできないstepiため、エラーが発生している正確な場所を特定する方法がわかりません (ツールチェーンをデバッグするため)。

lldGNU 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) が機能しないことを考えると、これは真実ではないと思います。

4

1 に答える 1

2

クロスコンパイルとは、コンパイルがホストマシン上で行われ、コンパイルの出力がターゲットマシン上で実行されるバイナリであることを意味します。したがって、コンパイルされたバイナリはホストCPUと互換性がありません。代わりに、ターゲットがこれをサポートしている場合は、そこでバイナリを実行し、サポートされている場合はツールチェーンからデバッガーを使用して、実行中のバイナリにリモートで接続できます。または、ターゲットでデバッガーを使用できる場合もあり、既に配置されているバイナリをデバッグできます。

もっと感覚をつかむfileために、コンパイルされたバイナリと、ホストの他のバイナリに対してコマンドを使用して、可能な違いを確認してください。

于 2016-01-08T08:09:18.773 に答える