問題タブ [abi]
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 - これを処理する方法: 選択したプロセッサは「qadd16 r1,r1,r0」をサポートしていません
私はAndroidアプリケーションを開発しており、その中でNDKに取り組んでいます。ファイルのコンパイル中に、選択したプロセッサが「qadd16 r1、r1、r0」をサポートしていないというエラーが表示されました。このエラーが発生する理由と場所、およびこのエラーに対処する方法を誰かが説明できますか? これが私のbasic_op.hファイルのコードスニペットです
前もって感謝します
assembly - doubleをulonglongに変換するときにClangが%eip+1を呼び出すのはなぜですか?
そして、結果はどこに保存されますか?通常は %eax であると読みましたが、64 ビット uint は広すぎます。スタックにも結果が見つかりません。
Clang 入力 (更新、署名が名前に対応するようになりました):
コンパイルと逆アセンブル (更新、再配置情報が追加されました。現在は fixuns* d *fdi を使用しています。):
主な手順(組み立て):
組み立て:
リンク:
デバッグ:
編集: C 関数の署名を修正し、リンク後に逆アセンブリを表示します。
残りの質問:
- unsigned int 6 がスタックのどこにもないのはなぜですか?
- 回答: %eax です。
linux - LinuxカーネルモジュールABI(x86)
x86のカーネルモジュールでの呼び出しに使用されるABIの公式定義を探しています。私は最近コンパイルされたモジュールを調べましたが、次のことに驚きました。
レジスタを使用して、最初の3つの引数(、、
eax
およびedx
) を渡しecx
ます。fastcall
GCCドキュメントで説明されているものとは異なります。ドキュメントには、fastcall
ecxとedx(Microsoftスタイル)を 使用していると書かれています。
私が見つけた唯一のやや関連性のある情報はこれでしたが、それはまったく何も言っていません。
それで:
1)カーネルモジュールで使用されるABIに関する公式ドキュメントはありますか(syscall ABIではなく、関数リストだけでなく、私が見つけたもの)。
2)この奇妙なfastcallはコンパイラによってどのように生成されますか?見逃したスイッチはありますか?
android - armeabi と armeabi-v7a の違い
ドキュメントからわかる限り、Android NDK でサポートされている 2 つの ARM アーキテクチャの違いは、サポートされている CPU 命令のセットのみです。本当にそうですか?呼び出し規約やシステム コール シーケンスなどに違いはありませんか?
モジュールを ARM オブジェクト ファイル (NDK 以外のコンパイラ (具体的には Free Pascal) を使用) にコンパイルし、アーキテクチャとして ARMv6 を指定し、それを armeabi および armeabi-v7a 共有ライブラリの両方にリンクするとどうなるか疑問に思っています。FPC ビットは、システム コールも Java コールも実行しないと想定されていますが、私自身の C ベースのインターフェイスを介する場合を除きます。
編集: ARM 用の FPC でコンパイルされた Hello World ライブラリは、ARMv7a エミュレーターでリンクおよび実行されます。
c - printf("%s", ...) の正当な引数に関するいくつかの質問
変更した printf 実装を作成していますが、これらの質問に対する答えがわかりません。
ゼロはヌル文字列として機能しますか? (
printf("%s", 0)
許される?)0 は
int
. しかし、これはこの質問を促します:NULL
null 文字列として機能しますか? (printf("%s", NULL)
許される?)NULL
論理的には、ポインターを意味するため、はいにする必要があると思います。しかし、多くの実装には があるように見える#define NULL 0
ので、実際にはそうではないかもしれません。どちらが正しい?ポインタ型はを指す必要があり
char
ますか? (printf("%s", (void const *)"")
許される?)タイプは問題ではないと思いますが、よくわかりません。
c - EnumはCでメモリをどのように割り当てますか?
C およびアセンブリ (intelx8086) 言語で作業しようとしています。
私はまた、私の友人によって実装された 1 つのクラスを使用しています。それは
このクラスをビット単位で操作したい (別名、アセンブリで構築/破棄)。私の質問は、「enum」がどのくらいのメモリを必要とするかです。
c++ - スクリプト例外ハンドラーをトリガーする C++ から例外を発生させる方法
私はウェブ上でこの回答の断片を見つけてきましたが、非常に明確な解決策ではありません。
これが私がやろうとしていることです。1) ATL シンプル オブジェクトを作成します。2) そのオブジェクトに、HRESULT ではなく BOOL を返すメソッドを追加します。呼び出し元は、true/false の戻り値が必要です。3) e.description および e.number データを提供する jscript または vbscript 呼び出し元に例外をスローします。
RE 2) STDMETHODIMP_(BOOL) を [local] と共に使用して、BOOL を返すことができることがわかりました RE 3) SetErrorInfo() を介して IErrorInfo を渡して、エラー オブジェクトを設定できることがわかりました
私のジレンマは、呼び出し元をクラッシュさせない ABI 境界を越えて例外をスローするように C++ を設計する方法を理解できないことです。
debugging - GCC での ABI 互換性の問題の検出
私は最近、かなりの時間を費やして、ライブラリをコンパイルすることによって引き起こされたことが判明した問題を追跡しました-D_GLIBCXX_DEBUG
(これは libstdc++ に追加チェック付きの標準ライブラリのデバッグ バージョンを使用するように指示します)。これにより、ABI の互換性の問題が発生しました。
GCC でこのような問題を自動的に検出する方法はありますか? Visual Studioには、この目的に役立つと思われるdetect_mismatch
プラグマが用意されていますが、GCC に相当するものは知りません。GCC はシンボル名 (例: ) を埋め込むことで何かを行いGLIBCXX_3.4.9
ます。対応するシンボル (例: ) が存在しない場合、未定義のシンボルが原因でリンク エラーが発生するスキームを想像mylib_debug_stl
できますが、そのシンボルの使用は本当にハックです。
あるいは、他の人はこの問題をどのように回避しますか? ライブラリのチェック済みバージョンを別の名前またはそのようなものにビルドしますか?
c++ - Qt アプリケーションで Visual Studio C++ dll ライブラリがクラッシュする
MS Visual C++ DLL ライブラリと Qt プログラムの間で "std::string" データを共有する際に問題があります。
私が持っているものは次のとおりです。
1 つのメソッドをエクスポートする Visual C++ 2010 Express で記述された DLL ライブラリ:
/li>抽象インターフェース「ITest」とそれを実装するクラス:
/li>以下を行う必要がある Qt GUI アプリケーション:
/li>
DLL の「Init」では、「CTest::getVersion()」メソッドが呼び出されます。「&version」文字列が入力されると思います。代わりに、「&version」に新しい文字列を入力すると、行がクラッシュします。
私がすでにしたこと:
http://qt-project.org/downloadsから「Qt libraries 4.8.3 for Windows (VS 2010, 235 MB)」をダウンロードしてインストールし、QtCreator のプロジェクト設定で選択しました。
QtCreator では、MinGW ツールチェーンから MS Visual Studio 2010 Express でインストールされたツールチェーンに切り替えました。
VS 2010 でコンパイルされた Qt ライブラリを使用し、Qt GUI も VS C++ ツールチェーンでコンパイルされていたため、問題は解決すると思いました。残念ながら、問題は解決していないので、最後の手順を試しました。
Visual Studio で Win32 コンソール アプリケーションを作成し、LoadLibrary を介して DLL をロードし、Qt GUI で行ったのと同じ方法で「Init」メソッドを使用しました...そしてうまくいきました!!
小さな観察
「CTest::getVersion()」では、参照によってコンソールに渡されたこの「バージョン」文字列を出力しています。VS C++ コンソール アプリをホストとして使用すると、正しく出力されます。Qt アプリを使用している場合 - 「バージョン」文字列がゴミとともに出力されます (例: ┌►☻qwerty27)
これは、上記の Qt VS 2010 ライブラリを使用している場合でも、Qt アプリの ABI と私の DLL がまだ互換性がないと考えさせられます。
質問:
- ABI の互換性の問題を解決するには、Windows (VS 2010) および Visual Studio ツールチェーン用の Qt ライブラリを使用するだけでは不十分ですか?
- 自分で Qt フレームワークをコンパイルする必要があるということですか?
- 助けてください - どんなアイデアでも大歓迎です...
linux - Linux、あるホストでコードをコンパイルして、別のホストで実行しますか?
コードは c/c++ で書かれており、コンパイル ホストの一部のライブラリに依存する場合があります。また、ライブラリに依存する問題なしに別のホストで実行する必要があります。どちらのホストも Linux で、バージョンが異なる場合があります。あなたは良い戦略を持っていますか?