問題タブ [dyld]
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 - LC_LOAD_DYLINKER と IOS のカスタム リンカー
Mach-O ファイルでサポートされている LC_ コマンドのリストを調べているときに、使用するダイナミック リンカーを指定する LC_LOAD_DYLINKER コマンドに気付きました。
IOS では、これは常に同じ場所 (デバイスの標準 DYLD) を指しているようです。
このコマンドを使用して、IOS でカスタム リンカーがサポートされているかどうかに興味がありました。サポートされている場合、それを作成するためのガイドラインはありますか? 誰もこれを以前にやったことがありますか?
macos - Mac OS Xアプリケーションは、dlopenがライブラリをロードするのを防ぐことができますか?
注意深くデバッグした後、バグのあるAppleバンドルをロードするシステムフレームワークに根ざしたアプリケーションのバグを発見しました。
私はこのバンドルのサービスの恩恵を受けていないと確信しており、多くのアプリが恩恵を受けているのではないかと疑っています。実際、Xcode自体を調べたところ、バンドルはガベージコレクションと互換性がないため、バンドルをXcodeのメモリスペースにロードできないことがわかりました。
したがって、理想的には、このバンドルがアプリにも読み込まれないようにします。それを行う1つの方法は、自分のアプリでGCを要求することですが、それを行うつもりはありません。誰かがdlopen()
このライブラリを呼び出すためのシステムフレームワークによる試みを回避する方法を考えることができますか?
linux - Linuxで実行可能メモリページを共有しますか?
スペースを節約するためにLinuxで実行可能ページを共有することは可能ですか?異なるプロセス間でメモリを共有するために使用できる共有メモリAPIがあることは知っていますが、それがそのために使用されることを意図しているとは思いません。
基本的に、一般的に使用される共有ライブラリをロードできる共有メモリ領域が必要です。すべての共有ライブラリイメージをすべての単一プロセスにロードするのではなく、動的リンカーをプリロードされた(読み取り専用)イメージに対してリンクさせたい(これは無駄のようです)。
これはLinuxカーネルで可能ですか?Darwinカーネルは、commpagesと呼ばれるMach VMの機能を使用してこれを実装します( dyld共有キャッシュはそこに保存されます)。Commpageは、すべてのプロセスにアクセスして共有できます。
明確にするために、私は共有オブジェクト(ライブラリ)が何であるかを知っています。現在、ダイナミックリンカがLinuxで行うことは、必要なすべてのライブラリをプログラムのアドレス空間にロードすることです。つまり、たとえばlibcに対してリンクする各アプリケーションは、アドレス空間のどこかにlibcのイメージを持ちます。ダーウィンでは、共有メモリページのセットにlibcの実行可能(およびその他の読み取り専用)セクションを配置することで、この問題を解消できます。共有画像の書き込み可能なセクションはまだ分離されています。
編集: ELF形式は、共有ライブラリのDATAセグメントとTEXTセグメントの分離をサポートしていないことを知っています。ELFを使用していません。別のバイナリ形式を使用しています(独自のbinfmtカーネルモジュールと独自のダイナミックリンカーを使用)。Linuxカーネルがcommpageのような機能をサポートしているかどうか興味があります。
編集2:これを行うことを考えることができる唯一の方法は、カーネルにメモリの大きなスラブを割り当て、実行されるすべてのバイナリにそれをマップすることです。バイナリが初めて実行されると、ダイナミックリンカはそのバイナリの保護を解除し、目的のデータを入力して保護することができます。次に、どういうわけか、カーネルは、メモリセグメントが他の何かによって変更されていないことを確認する必要があります。これは、大規模なセキュリティホールを開くためです。別
c - プロジェクトのプロファイリング時に dyld と localtime のリークを解決するにはどうすればよいですか?
ソースをプロファイリングしています。を実行すると、終了時にまだ生きているいくつかの割り当てが表示されますvalgrind
。
要約は次のとおりです。
責任のあるライブラリは次のとおりです。
dyld
: すべての 81 の malloc には、次のような共通の呼び出しがあります: (手がかりはありません)
{libsystem_c, libsystem_notify, libdispatch}.dylib
: 10 個すべての malloc には、次のような共通の呼び出しがあります。
localtime(...)
で定義されている を初期化して返すためにtime.h
使用しますが、割り当てていないため、自分ですべきではありません。tzset(...)
struct tm*
free
まだ到達可能なこれらの 20,228 バイトを回復するにはどうすればよいですか?
アップデート
Mac OS X を実行しています
linker - dyld インポートされたシンボルを解決するにはどうすればよいですか?
私は dyld が行うことのいくつかの部分を実装しようとしていますが、スタブ トランポリンで少し立ち往生しています。
次の ARM 命令を考えてみましょう。
0x2fecへのリンク(サブプロシージャコール)で分岐します。0x2fd8 で始まる __TEXT セグメントにセクション __symbolstub1 があることを認識しているため、__symbolstub1 内の 20 バイトにジャンプします。
今、シンボルがあります
LC_SYMTAB ロード コマンドで解決しました。提供された既知のアドレスはありません。実際、0x2fec アドレスが _objc_autoreleasePoolPush のトランポリンであることはわかっていますが、それを証明することはできません。
私は LC_DYLD_INFO_ONLY コマンドをチェックしましたが、私が見つけた lazy_bind シンボルで、そこにわずかなヒントがありました:
ここで、名前とオフセットは私が持っているものと正確に一致し、ライブラリ #6 は「/usr/lib/libobjc.A.dylib」であり、これも完璧です。ここでの問題は、セグメント #2 が __TEXT であるということですが、__TEXT は 0x1000 から始まり、__symbolstub1 は 0x2fd8 のはるか下にあります。そのため、セクションへの参照が欠落しています。
0x2fec 仮想アドレスを _objc_autoreleasePoolPush にマップする方法についてのアイデアはありますか?
ios - iPhoneのdyldAPI-奇妙な出力
私はあなたに3つの質問があります、すべてdyldに関連しています:)
私はこのdyldmanページをベースとして使用しています。次のコードをコンパイルし、ジェイルブレイクされたデバイスでバイナリを正常に実行しました。
これらの関数を使用すると、プログラムのアドレス空間にロードされているすべての共有ライブラリを見つけることができると思いました。私のMacでは、出力は非常に単純です。現在メモリにロードされているすべてのライブラリへのパスが表示されます。私のiPhoneでは、出力はほぼ同じです-ファイルパスも取得します-しかし、指定された場所にファイルがありません。(一方、私のMacでは、ファイルを見つけることができます!)
これは出力からのサンプル行です:/usr/lib/system/libdyld.dylib
ls、iFile、および私が使用した他のすべてのツールによると、このディレクトリ(/ usr / lib / system /)は空です。なんで?それらのファイルはどこにありますか?
私が知りたいもう一つのことは:メモリ内のライブラリを見つけることは可能ですか?ライブラリがメモリにマップされるオフセットからオフセットまで?私は最初を見つける方法を知っていると思いますが、ライブラリの終わりを見つける方法がわかりません。始まりを見つけるために、私は_dyld_get_image_headerによって返されたアドレスを使用します-それは正しいですか?
最後の質問:システム全体に動的ライブラリをロードしたかったので、DYLD_INSERT_LIBRARIESを使用してそれを実行できると思いました。ただし、libを挿入した後に実行しようとするすべてのバイナリがクラッシュし、バスエラーが発生します。何かを忘れましたか、それともクラッシュの原因となるダイナミックライブラリですか?
ios - dyld の問題 (ライブラリがロードされていません)
プロジェクトをビルドすると、次のメッセージが表示されます。
dyld: ライブラリがロードされていません:
これはダイナミック リンク エラーです。私が理解しているように、画像が見つからないためにこのエラーが発生しました。これは正しいです?
エラーを解決するには、どのような手順を実行する必要がありますか?
私はこのリンクを見つけました.xcode 4.3を使用しているため、このエラーが発生したことを理解しています。今、私はこれを4.2で試してみましたが、うまくいきました。
しかし、XCode 4.3で実行する方法がわかりません
ios - dyldの問題ライブラリがロードされていません
ターゲットをビルドしようとすると、動的リンカーで次のエラーが発生します。
上記のパスで参照されているこのiphonesimライブラリリンクを使用します。
私は Xcode 4.3 を使用していますが、この場合、パスが間違っていると思います。
このパスを正しいパスに変更するにはどうすればよいですか?
macos - info.plistのLSEnvironmentセクションは効果を発揮しません。
DYLD_INSERT_LIBRARIESという名前の環境変数を設定することでいくつかのターゲットアプリケーションにロードされるダイナミックライブラリを作成しました。dylibロードであり、アプリケーションがターミナルから次のコマンドで実行されると正常に動作します。
次に、info.plistファイルのLSEnvironmentセクションを編集して、DYLD_INSERT_LIBRARIESの値を設定します。テキストエディットや電卓などの一部のアップル標準アプリケーションはライブラリを正常にロードしますが、この設定はInDesign、Photoshop、...などのアプリケーションには影響しません。
一部のアプリケーションで環境変数が設定されないのはなぜですか?誰かがそれについて考えを持っていますか?ありがとうございました。
x11 - ソフトウェアをビルドするときにOSX10.8 Mountain LionがX11ライブラリを見つけられないのはなぜですか?
したがって、Mountain LionにはX11が付属しておらず、X11を必要とするユーザーはXquartzをダウンロードするように指示されていることは誰もが知っています。Xquartzはにインストールされますが/opt
、シンボリックリンクX11
とX11R6
にインストールされ/usr
ます。しかし、X11インクルードファイルへのリンクを必要とするソフトウェアを構築するとき、X11ライブラリを見つけるためにライブラリ検索パスに追加/usr/X11/include
(または)する環境変数を渡す必要があることに気付きました。私の質問はなぜですか?/opt/X11/include
./configure
私はGoogleでいくつかの調査を行い(多くの結果はStack Overflowを指し示しています)、Appleのドキュメントを読みました。これらのソースはすべて、OS Xには/etc/ld.so.conf
多くの(すべてではないにしても)ファイルに相当するものがないことを示しています。 Linuxディストリビューション。DYLD_LIBRARY_PATH
Appleはそれがデフォルトで空であるとさえ述べています。ただし、Lion(Appleの最後の「公式」X11がインストールされている)では、同じ./configure
スクリプトがライブラリ検索パスに何も追加せずにX11ライブラリを検索します。
では、ライブラリ検索パスを明示的に変更しないと、スクリプトがMountain LionでX11ライブラリを見つけられないのはなぜですか?./configure