問題タブ [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++ - Qtコンテナを共有ライブラリの関数にパラメータとして渡すにはどうすればよいですか?
私はライブラリ関数を書いていますが、vectors
&のような引数maps
をそれに渡すことができるようにする必要があります。
ライブラリのヘッダーで宣言された STL パラメーターを持つ関数を使用できないことはわかっています。
ライブラリと実行可能ファイルが同じコンパイラと設定でコンパイルされていない限り、バイナリ互換性の問題のため。
一方、Qt Template Libraryを使用すると、次のように動作します
彼らが提供する DLL は、おそらく私のものとは異なるコンパイラによってコンパイルされたものですが。
この互換性の問題を克服するため に、Qtは、、、、でどのような手法を使用していますか?QMap
QValueList
QString
私は彼らのコードを少し読んだことがありますが、テクニックを分離することはできません.
質問 1:彼らの技術を適用するコードの書き方について、誰かが私に説明してくれますか?
機能することがわかっている唯一の手法は、string
/map
を不透明なポインターとして提供するか、 pImplイディオムを使用することです。
質問 2:この種の呼び出しを実現するために、「ネイティブ」STL ヘッダーの代わりに STLPort を使用できますか? それはSTLのパフォーマンスにどのように影響しますか?
iphone - 任意の OS で異なる形式の実行可能ファイルを実行する
私が正しく理解していれば、これは人が考えるほど難しいことではないはずです。具体的には、iOS と ELF 実行形式から始めます。私はジェイルブレイクされた iPhone を持っており、どのアプリストア アプリでもこれを実行したくないことを明確にしましょう。そのため、「Apple によって禁止されているため実行できません」などの「適切なアドバイス」は避けてください。
それで、私が見たのは、Frash と呼ばれる Flash プレーヤーの実装があることです (最近のジェイルブレイクの開発者である Comex によるものです)。このユーティリティでは、インストール後に、Android の libflashplayer.so が iPhone ファイル システムに存在する (コピーされている) 必要があります。ソースコードを掘り下げたところ、微調整が実際に Android (ELF) 共有オブジェクト ファイルを開き、それを「解析」してそこからコードを実行することがわかりました。私はすでに友人に、それが実際に可能か不可能かを尋ねたところ、ARM 上の ELF と ARM 上の Mach-O はバイナリ互換であるため (両方とも ARM であるため)、可能であると彼は言いました。しかし、彼は実際に私にそれを詳細に説明することができなかったので、どうすればそれができるのか聞いてみたい. 処理するソース コードの断片を正確に理解することはできませんが、1 つ確かなことは次のとおりです。
(GitHub の 2011 年 2 月 12 日時点の元のコードから)
彼はlibelfを使ってこれを実行しているように思えますよね?そして、ELF ファイルには、互換性のあるプロセッサで問題なく実行できるシンボルが含まれていますか?
また、他のすべてのプロセッサ アーキテクチャに当てはまるかどうかも知りたいですか? では、OS X で Linux バイナリからシンボルを実行できるのでしょうか?
c++ - STLコンテナとバイナリインターフェイスの互換性
STLバイナリインターフェイス
C++用の複数のコンパイラとプラットフォーム間でSTLオブジェクトの互換性のあるインターフェイスレイヤーに取り組んでいる人がいるかどうか知りたいです。
目標は、STLタイプをファーストクラスまたは組み込みのデータ型としてサポートすることです。
これを防ぐ一般的なテンプレートによって課せられる固有の設計上の制限はありますか?これは、バイナリ配布にSTLを使用する際の主な制限のようです。
理論-おそらく答えは実用的です
Microsoftは.NETに力を入れており、C++STLサポートが「ファーストクラス」であることをあまり気にしていません。
オープンソースは、バイナリのみの配布を促進することを望んでおらず、10の異なるバージョンの不一致ではなく、単一のコンパイラで問題を解決することに重点を置いています。
これは、Qtや他のライブラリでの私の経験によってサポートされているようです。これらは通常、使用する環境のビルドを提供します。たとえば、Qt4.6およびVS2008。
参照:
c++ - Linux (elf) での共有ライブラリとリンク
Boost を使用する下位互換性のある ABI を使用したライブラリの作成に関するスレッドを読み、共有ライブラリをリンクして安定した ABI を維持し、干渉するシンボルの問題を回避する方法を理解しようとしています。
次の簡単なテスト プロジェクトを作成しました。
ライブラリ common_v1 および common_v2 は、ライブラリ a および b (Boost など) の外部依存関係をエミュレートする必要があります。common_v1 と common_v2 は外部ライブラリと見なされるため、ビルド システムを変更しないことをお勧めします (したがって、コンパイル時のフラグも変更しません)。
上記のプロジェクトは正常にコンパイルされますが、動作しません! テスト アプリケーションが実行されると、assert ステートメントにジャンプします。
これは、liba と libb の両方で共通の同じ定義が使用されていると思わせます。なぜそうなのか、何が間違っているのでしょうか?
objective-c - Objective-C 2.0 ABI 仕様
Objective-C 2.0 ABI のドキュメントはインターネット上のどこかにありますか? 言うためのリリースノートobjc4-493.9
:
今後のドキュメントでは、コンパイラと開発者ツールのみを使用するための ABI について説明します。
それ以来、それはリリースされましたか?そのようなリファレンスに最も近いのは Apple のObjective-C ランタイム リファレンスですが、これは実装の詳細ではなく、一般向けの API についてのみ説明しています。実際、ABI についても触れています。
さらに、新しい Objective-C ABI (ここでは説明しません) [...]
残念ながら、新しい ABI は前述のテキストにハイパーリンクされていません。:-)objc4
ランタイムと Clang のCGObjCNonFragileABIMac
コード生成プロジェクトのソース コードを理解する唯一のオプションはありますか?
linux - x86-64 マシンのシステムコールのプロトタイプはどこで確認しますか?
つまり、どうやってわかるの
特定のシステムコールが期待するパラメータの数
各パラメータが入るレジスタ、
最後に、各パラメータの意味は?
それを伝える同様のコマンドはありman
ますか?
java - Java Native Interface (JNI) は C++ ABI の互換性の問題の影響を受けますか?
Java Native Interface (JNI) は C++ ABI の互換性の問題の影響を受けますか?
私はJavaアプリケーションを開発しています。Java Native Interface (JNI) を使用して C++ ライブラリの関数を呼び出したいと考えています。C++ ライブラリのコードにアクセスできるので、必要に応じて再構築できます。(たとえば、C++ ランタイムを静的にリンクできます。)
ユーザーに JRE 6 以上を要求することはできますが、特定の C++ ランタイムを要求することはできません。
同僚がこのブログ記事を指摘してくれました: http://www.trilithium.com/johan/2005/06/static-libstdc/動的にロードされた C++ コードを使用しないようにアドバイスしています。
別の同僚がこのバグ レポートを指摘してくれました: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4694590には、これらの問題が Java 1.4.2 でどのように対処されたかが詳しく説明されています。
問題の要点は、私が理解しているように、libstdc++ のバイナリ インターフェイスが頻繁に変更されることです。C++ アプリケーションが別のコンパイラでビルドされた C++ 共有ライブラリをロードすると、互換性のない 2 つの libstdc++ ライブラリが同時にメモリにロードされます。
バグ レポートでは、Java 1.4.2 の解決策について説明しています。ネイティブ コードが C++ ランタイムを呼び出す必要がある場合、呼び出しは適切な libstdc++.so で解決されます。まだ 2 つの libstdc++.so が同時にロードされていますが、問題はありません。"
これについていくつか質問があります。
まず、OpenJDK はこのアプローチを採用し続けますか?
[編集: OpenJDK の build-dev メーリング リストでこの質問をしました。答えはイエスです。HotSpot は依然として libstdc++ を静的にリンクしていますが、明らかに「ほとんどの Linux ディストリビューションはこれにパッチを当てています」。別の開発者は、これにはパッチさえ必要ないと指摘しています:「STATIC_CXX=false を設定するだけで十分です (デフォルトは true)。」]
次に、この場合でも、互換性のない 2 つの libstdc++.so を同時にロードすることは本当に問題ないのでしょうか?
第三に、このアプローチ (JDK でシンボルを非表示にする) は、すべての互換性の問題に対処していますか?
上記のブログ記事では、「異なる ABI に対してコンパイルされたコードは、バイナリ互換性がない」と警告しています。そしてその後、「言語ランタイムのサポートは通常、共有されているデータに依存しています。たとえば、ある種のロックまたはグローバルデータ構造にアクセスするためです (C プログラムが共有 errno を必要とする方法と同様です)。」
これは、問題を解決できないように聞こえます。
もう一度言いますが、ABI の非互換性はもはや問題ではありません。ブログ記事は6年以上前のものです。別のスタックオーバーフローの質問 ( GCC ABI 互換性) に対する 1 つの回答は、「gcc-3.4.0 以降、ABI は前方互換性がある」と主張しています。それは成功しましたか?
これらの問題に関するガイダンスをいただければ幸いです。(そしてねえ、これをすべて読んでくれてありがとう!)
編集
私の質問はかなり長くなったので、すべての詳細を述べませんでした。ウィルのコメントに対処するには:
- extern "C" 関数を呼び出すだけです。(たとえば、javah を使用して C ヘッダー ファイルを生成します。)
- JVM で C++ ランタイムを操作する必要はありません。(基本的には、文字列を C++ ライブラリに送信する必要があるだけです。)
java - Eclipse は C++ ABI の互換性の問題に対処する必要がありますか?
Eclipse プロジェクトは、Linux 用のインストーラーを提供します。これらのインストーラー (またはインストールされた実行可能ファイル) には、コンパイルされた C++ コードが含まれていますか? もしそうなら、Eclipse はどのようにして C++ ABI の互換性の問題を回避していますか?
Eclipse のネイティブ ライブラリ ( SWTなど) はすべて C で作成する必要があると考えました (ここでは Windows は無視します)。SWT のソースを調べているときに、 XPCOM 関連のコードが C++ で作成されていることに気付きました。
それで、トリックは何ですか?インストーラーから Eclipse をインストールした場合、このようなものは入手できますか? もしそうなら、どの C++ ランタイムがマシン上にあるかに関係なく動作しますか? もしそうなら、「彼ら」はどのようにそれをしますか?
(先制的にピーナッツ ギャラリーに対処するには: パッケージ マネージャーを使用して Eclipse をインストールするだけでよいことに気付きました。プログラムが私のマシン用に特別に調整されていない場合について質問しています。)
SWT の FAQで、「SWT は JNI を使用して、オペレーティング システムのネイティブ ウィジェットと対話します。SWT JNI ライブラリは、対象のウィンドウ システム、オペレーティング システム、およびハードウェア アーキテクチャ用にコンパイルする必要があります。」と説明していることに気付きました。
「では、Eclipse はどのようにして Linux 用のフリーサイズのインストーラーを作成できるのでしょうか?」(たぶん、これらのインストーラーのいずれかを使用してみれば、すべてが明らかになるでしょう。しかし、場合によっては、より良い人に聞いたほうがよい場合もあります。)
JNI を使用する Java プロジェクトが C++ ABI の互換性の問題にどのように対処するかを理解しようとしています。数日前に同様の質問をしましたが、まだあまり聞いていません ( Java Native Interface (JNI) は C++ ABI 互換性の問題の影響を受けますか? )。Eclipse は同様の問題に対処しなければならない可能性があるため、Eclipse の専門家が何らかのガイダンスを提供してくれるかもしれないと考えました。
明確にするために: Java プロセスは基本的に C++ ライブラリを使用できないようです。Java プロセスには C++ ランタイムが必要です。共有ライブラリに互換性のない C++ ランタイムが必要な場合は、おそらくもうおわかりでしょう。
(これをすべて読んでくれてありがとう。)
c - libelf ヒントを使用した ELF 生成
libelf を使用して単純な静的 ELF を生成しようとしていますが、問題が発生しているようです。
オブジェクト ファイルを生成してから LD にリンクするのではなく、自分で生成したいと考えています。
このプログラムの主な目的は、1 つの LOAD セグメントで静的 ELF を生成し、コードを実行することです。
主な問題はシェルコード自体にあるのではなく、おそらく私が間違った方法で作成しようとしているいくつかのヘッダーにあります。生成された ELF を実行しようとすると、ロードしたばかりのセグメントをカーネルが見つけられなかったかのように強制終了されます。
ヒントをいただければ幸いです。
create_elf.3.c
誰かがここで何が悪いのかを教えてくれたら嬉しいです
ありがとう
編集
詳細をお伝えできず申し訳ありませんが、
ELF 生成は問題なく動作しているようですが、構文エラーなどは発生しませんが、生成した ELF を実行しようとするたびに、./create_elf.3 foo14 (および foo14 が生成された ELF) のようになります。
execve/kernel が適切にロードしたくないかのように、強制終了されます IDA を使用してロードしようとしましたが、IDA は逆アセンブルされたコードを十分に表示します
ここに readelf からの出力があります