問題タブ [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.
ios - iOS 2.x ABI での R9 の使用?
iOS ARM ABI で使用される R9 レジスタは何ですか? ABI のドキュメントでは、「R9 の登録には特別な用途があります」と書かれていますが、実際には何に使用されるかは言及されていません。
c++ - C++ モジュールと C++ ABI
C++ モジュールの提案 (最新のドラフト)について読んでいますが、それが解決しようとしている問題を完全には理解していません。
あるコンパイラによってビルドされたモジュールを他のコンパイラ (もちろん同じ OS/アーキテクチャ上) で使用できるようにすることが目的ですか? つまり、この提案は C++ ABI の標準化に相当しますか?
そうでない場合、C++ ABI を標準化し、コンパイラの相互運用を可能にする別の提案が検討されていますか?
linux - プログラムの起動時のデフォルトのレジスタ状態は何ですか (asm、linux)?
プログラムの起動時 (linux、elf) - 、 などにゼロがeax
ありebx
ますか、それとも何かある可能性がありますか (私は呼び出しを行っていないか、extern ライブラリを使用していません)? 私のマシンでは本当にそうです.asmプログラムを書くときにそのような振る舞いを中継できますか?
c++ - C++ ABI を混合してレガシー ライブラリに対してビルドする
最近の GCC (4.3.3) を使用している C++ コードベースを持っていますが、GCC 3.2.3 を使用して構築された古いライブラリにリンクする必要があります。利用可能なライブラリの新しいバージョンはありません。それなしでは行きません。また、クローズド ソースであるため、再構築することはできません。
GCC 4.3.3 と 3.2.3 の間には ABI の非互換性があるため、これは問題を引き起こしているようです。そのため、これを解決するためのオプションを確認しようとしています。
いくつかの追加の詳細:
- -fabi-version=1 を使用してコードベースのすべてを再構築し、正しい ABI バージョンを取得できますが、libstdc++ バージョン 6 のいくつかの新しい機能に依存しています。
- コードベース以外のすべての C++ ライブラリの依存関係はオープン ソースであるため、この 1 つのライブラリを除いて、必要に応じて再構築できます。
- 再構築できない、または再構築が困難な多くの C ライブラリ依存関係。
- 古いライブラリは libstdc++ バージョン 5 の一部の機能に依存しているようです
私はこれまでに試しました:
- -fabi-version=1 を使用してすべての C++ コードと依存ライブラリを再構築し、libstdc++ バージョン 6 に対してリンクします。これは、C++ 標準ライブラリ シンボルの少数の未定義シンボル エラーで失敗します。
- 上記と同じですが、さらに libstdc++ 5 の共有ライブラリにリンクします。これによりリンカーの問題は解決されますが、レガシー ライブラリ内で実行時に 2 つのバージョンが混在するように見え、クラッシュが発生します。
このページを読みました: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.htmlこれは、ライブラリ間のさまざまな依存関係を満たすために、アプリケーションで C++ ABI バージョンを混在させることが可能であることを示しているようです。ただし、何かが欠けていない限り、ここではうまく機能していないようです。
何か案は?
c++ - VisualStudioのバージョン間のライブラリABIの互換性
2つのシナリオがあります。C ++シンボルをエクスポートする3つの共有ライブラリがあり、それぞれがVS7.1、VS8、およびVS9で構築されているとします。3つすべてをVS9でコンパイルします。何らかの理由で、これは機能します。シンボルを正常に見つけてそれらに対してリンクするために、VS9リンカー用にVS9の最初の2つのライブラリを再コンパイルする必要はありません。
さて、C構文(extern "C")を使用してシンボルのみをエクスポートするライブラリがある場合、これは同じですか?ABI for Cは標準化されていると言われているので、VisualStudio8でコンパイルされたCライブラリをすべてのバージョンのVisualStudioで使用できるという保証があります。
基本的に、これらすべての組み合わせは混乱を招きます。異なるバージョンのVisualStudio間でC++ベースとCベースの両方の共有ライブラリ(対応するインポートライブラリを使用)に対してリンクすることについて、どのような保証があるのかわかりません。他のバージョンのVisualStudioでのCおよびC++インポートライブラリまたは静的ライブラリの両方の下位/下位互換性に関する一般的なコンセンサスを聞きたいです。
これが私に思い浮かんだ理由は、私が使用しているVisual Studio .NET 2003(VS7.1)でコンパイルされたクローズドソースライブラリがあるためです。私のチームは、これがVS 7.1コンパイラにロックされていると考えていますが、VS8とVS9の両方、さらにはVS2010でこれらのライブラリをテストし、正常にリンクしています。しかし、これに内在する危険性についてはよくわかりません。問題のライブラリにはCバリアントとC++バリアントがあることに注意してください。基本的に、Cバリアントは標準Cエクスポートであり、C++ライブラリはCライブラリとエクスポートクラスを抽象化したものです。
assembly - 呼び出し先と呼び出し元の保存済みレジスターとは何ですか?
呼び出し元と呼び出し先の保存済みレジスタの違いと、いつ何を使用するかを理解するのに問題があります。
私はMSP430を使用しています:
手順:
上記のコードは呼び出し先であり、教科書の例で使用されているため、規則に従います。R6とR7は呼び出し先が保存され、R12は呼び出し元が保存されます。私の理解では、呼び出し先が保存したregは、プロシージャ内の値を変更してもプロシージャ外の値に影響を与えないという意味で「グローバル」ではありません。これが、最初に呼び出し先regに新しい値を保存する必要がある理由です。
R12、保存された発信者は「グローバル」です。より良い言葉がないためです。プロシージャが行うことは、呼び出し後のR12に永続的な影響を及ぼします。
私の理解は正しいですか?私は他のものが欠けていますか?
c++ - 仮想関数のエイリアスを生成するようにコンパイラに指示する方法は?
背景については、この質問を参照してください。
基本的に、クラスの次の定義があります
に解決される 2 つのシンボルを生成するようにコンパイラに指示する方法はありfoo4
ますか? つまり、実行可能ファイルがダイナミック リンカに_ZN7MyClass4foo4Edi
(シンボルのMyClass::foo4(double, int)
) と他のシンボル (たとえば のシンボル)_ZN7MyClass9reserved1Ev
を解決するように要求した場合MyClass::reserved1()
、ダイナミック リンカは両方を に解決することを望みます&MyClass::foo4(double, int)
。Linux でかなり最新の GCC を使用しています。
c++ - クラスからポインターを返します。削除の責任者は誰ですか?
バイナリ互換インターフェイス (共有ライブラリとして使用される) を実装する C++ クラスがあるため、C 型のみが返されます。const char* としての文字列、void ポインター、およびバイナリー互換インターフェースを持つ他のクラスへのポインター。問題は、メモリ管理をどのように整理するか、既存のクラス データへの定数ポインタを返すか (ユーザーが古いポインタを使用する危険性があります)、そこにあるメモリを自分で解放するか、またはいくつかのヒープ変数へのポインタを解放し、それらのポインタを削除する責任をユーザに負わせるかです。後で、または??? そのための一般的なガイドラインはありますか?
c++ - C/C++ スタティック ライブラリに関する推論
以下の問題について考えたことはありませんが、コード内の多数の依存関係に対処する必要があるため、事実を明確にしたほうがよいと思いました。これを、ubuntu amd64 などの最新の Linux バージョンに制限しましょう。
静的ライブラリには動的ライブラリ参照が含まれていないため、未定義のシンボルは静的ライブラリでどのように解決されますか? 依存するバイナリは未定義のシンボルを動的にロードできますか、それともコンパイル時に別の静的ライブラリまたはオブジェクト ファイルによってシンボルを解決する必要がありますか?
コンパイラは動的ライブラリにリンクすることで (静的ライブラリに依存するアプリケーションの) 依存関係を解決できますか? その場合、コード テキストは結果のバイナリに静的に解決されるか、または動的参照が存在しますか?
たとえば、静的ライブラリL
はmalloc
fromlibc6.so
を使用し、それは application によって使用されますA
。どちらもlibc6.soL
のA
malloc を動的に使用しますか?