問題タブ [shared-libraries]
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.
linux - 異なるバージョンの複数の共有ライブラリをロードする
Linux上に(別の共有ライブラリを介して)依存関係の1つとしてロードするlibfoo.so.1
(つまり)実行可能ファイルがあります。SONAME
また、別のシステムライブラリにリンクし、システムライブラリはシステムバージョンにリンクしますlibfoo.so.2
。その結果、との両方が 実行中に読み込まれ、バージョン1のライブラリから関数を呼び出すはずだったコードは、バージョン2の新しいシステムライブラリから(バイナリ非互換の)関数を呼び出すことになります。これは、一部のシンボルが同じままであるためです。その結果、通常、スタックスマッシングとそれに続くセグメンテーションフォールトが発生します。libfoo.so.1
libfoo.so.2
現在、古いバージョンに対してリンクしているライブラリはクローズドソースのサードパーティライブラリであり、どのバージョンlibfoo
に対してコンパイルするかを制御することはできません。と仮定すると、残っている他の唯一のオプションは、現在リンクしているシステムライブラリの束を再構築しlibfoo.so.2
てリンクすることlibfoo.so.1
です。
古いものにリンクするローカルコピーでシステムライブラリを置き換えることを回避する方法はありますlibfoo
か?両方のライブラリをロードして、正しいバージョンのシンボルを呼び出すコードを作成できますか?だから私はいくつかの特別なシンボルレベルのバージョン管理が必要ですか?
c++ - ライブラリ X を静的にリンクするように指定するにはどうすればよいですか?
複数のライブラリにリンクされているソフトウェアがあります。それらはすべて、動的 (.so) および静的 (.a) バージョンで存在します。デフォルトでは、g++ を使用するとライブラリの動的バージョンが選択されますが、それで問題ありません。
ただし、そのうちの 1 つは必ず静的にリンクする必要があります。-staticを使用することを考えましたが、それらすべてに静的バージョンを使用します。これは私が望むものではありません。
ライブラリ X を静的にリンクする必要があることを指定するにはどうすればよいですか?
windows - Windows DLLがアプリケーションからインポートするシンボルを制御するにはどうすればよいですか?
MSVC 6(レトロ!)を使用してWindowsで共有ライブラリ(DLL)を構築しようとしていますが、解決する必要のある固有のリンクの問題があります。共有ライブラリは、読み込み中のアプリケーションによって制御されるグローバルな状態にアクセスする必要があります。
大まかに言って、私が持っているのはこれです:
application.c:
shared_library.c:
(更新-その部分を忘れました__declspec(dllexport) int __stdcall
が、実際のコードにあります)
shared_library_method
エクスポートおよびインポートするようにshared_library.dllを設定するにはどうすればよいuse_private_value
ですか?
A)私は一般的にUNIXプログラマーであり、B)VisualStudioなしでこれを行っていることを覚えておいてください。自動ビルドインフラストラクチャは、makefileを使用してMSVCを駆動します。質問に答えやすくするために省略している場合は、コメントしてください。できるだけ早く更新します。
shared-libraries - pkglib_LTLIBRARIES = test.la を使用して *.so のみをビルドする方法
autotools を使用して共有オブジェクトを構築しています。
pkglib_LTLIBRARIES
Makefile.am で使用すると、 libtest.la
ANDlibtest.so
が構築されます。
ビルド/インストールするだけですlibtest.so
。
これは可能ですか?
unix - Unixの質問:ローカルにインストールされたライブラリのパスを自動的に認識する
私はFedoraLinuxボックスに取り組んでいます。
ホームディレクトリの下にローカルにインストールしたバイナリとライブラリのホストがあります。
システムをセットアップしたいので、そこにソフトウェアをインストールすると、rootユーザーがプレフィックスなしでインストールした場合と同じように機能します(私にとっては)。
PATH変数にそのディレクトリを追加することで〜/ local / binにインストールされたバイナリを問題なく実行できますが、〜/ local / libおよび〜/ local / lib64のライブラリにリンクするのはどうですか?
LD_LIBRARY_PATH変数に似たものがありますが、実行時ではなくコンパイル時にライブラリを検索しますか?L〜/ local/libまたは./configureスクリプトのフラグを介してコンパイラにパスを明示的に渡すことについて心配したくありません。
linux - Linux のバイナリ ファイル (ライブラリまたは実行可能ファイル) のターゲット ISA 拡張子を決定する
Via C3 プロセッサを搭載した Advantech POS ボード上の (かなり古い) FC3 で実行されている Java アプリケーションに関連する問題があります。Java アプリケーションには、JNI 経由でアクセスされるコンパイル済みの共有ライブラリがいくつかあります。
C3 プロセッサ経由は i686 と互換性があるはずです。少し前に、同じプロセッサを搭載した MiniItx ボードに Ubuntu 6.10 をインストールした後、前の説明が 100% 真実ではないことがわかりました。Ubuntu カーネルは、C3 プロセッサに設定された i686 のいくつかの特定のオプション命令が不足しているため、起動時にハングアップしました。i686 セットの C3 実装にないこれらの命令は、i686 最適化を使用する場合、GCC コンパイラによってデフォルトで使用されます。この場合の解決策は、Ubuntu ディストリビューションの i386 コンパイル バージョンを使用することでした。
Java アプリケーションの基本的な問題は、FC3 ディストリビューションが別の PC (今回は Intel P4) の HD のイメージから複製することによって HD にインストールされたことです。その後、ディストリビューションを実行するには、いくつかのパッケージ (カーネルのものなど) を i386 コンパイル済みバージョンに置き換えるなど、いくつかのハッキングが必要でした。
問題は、しばらく作業した後、システムが跡形もなく完全にハングすることです。いくつかの i686 コードがシステムのどこかに残っていて、いつでもランダムに実行される可能性があるのではないかと心配しています (たとえば、サスペンド モードからの回復後など)。
私の質問は:
- バイナリ ファイル (実行可能ファイルまたはライブラリ) が必要とする特定のアーキテクチャ拡張機能を確認するツールまたは方法はありますか?
file
十分な情報を提供しません。
tomcat - 2 つの Web アプリにある場合、Tomcat は同じライブラリ ファイルをメモリに 2 回読み込みますか?
tomcat/webapps
フォルダ の下に 2 つのアプリケーションがあります。
両方のアプリケーションが同じライブラリを共有します。たとえば、に保存されtomcat/webapps/App1/WEB-INF/lib
ます。
両方のライブラリがメモリに 2 回読み込まれていますか?
これらの共有ライブラリを に配置する必要がありtomcat/server/lib
ますか?
linux - クロス コンパイルされた .so ファイルのシンボルをチェックするツールはありますか?
起動時に.soファイルをプラグインとしてロードするアプリケーションを持っています.dlopen()
ビルド環境は x86 ハードウェアで実行されていますが、アプリケーションは別のプラットフォーム用にクロス コンパイルされています。
アプリケーションを実際にデプロイすることなく、(自動ビルド プロセスの一部として) .so ファイルとアプリケーションの組み合わせに未解決のシンボルがないことを確認するチェックを行うことができれば素晴らしいことです。
の出力を使用してシンボルをテストするスクリプトを作成する前に、nm
これを既に実行しているユーティリティを誰か知っているかどうか疑問に思っています。
編集1:説明をわずかに変更しました-.soでシンボルをテストしようとしているだけでなく、いくつかの.soとアプリケーション自体の組み合わせでテストしようとしています-つまり. アプリケーションがすべての .so をロードした後、まだ未解決のシンボルがあるかどうか。
回答で示唆されているように (Martin v. Löwis と tgamblin に感謝)、nm
単一のファイルで欠落しているシンボルを簡単に識別できますが、それらのシンボルのどれが他のロードされたモジュールの 1 つで解決されたかを簡単に識別できません。
c++ - C++ で共有ライブラリ (so) 内の共有メモリにオブジェクトを作成する
このコードにリンクするすべての人の間で単一の「神」インスタンスを共有し、共有オブジェクトに配置することは可能ですか?
すべての関数の開始時にロック同期を実行し、神自身が他のものを新規作成/mallocできることを考えると、それらのものは決して呼び出し元に返されることはありません(神は内部使用のためだけにmallocします)、最も単純なものは何ですかできればその方法。
この共有ライブラリにリンクされた任意の数のプログラムにどのように拡張できますか?
gcc - 共有オブジェクトのシンボルを LD から非表示にします
同じシンボル名がエクスポートされることがある 2 つのサードパーティ ライブラリがあります。実行可能ファイルがロードされると、通常、ldは間違ったものを選択し、結果としてクラッシュします。私はこれらのライブラリの内容についてあまり多くを行うことができないので、ldに適切な実装を見つける方法を指示する方法があるかもしれません。
OS - Solaris 10、私のプログラムは autoconf/autotools/gcc でビルドされています。競合するライブラリはlibclntsh (Oracle ドライバーの一部) と OpenLDAP です。残念ながら、Oracle の LDAP クライアントの実装は使用できません。OpenLDAP が持つ多くの機能が欠けています。
編集: リンクは次のとおりです: libclntsh.so->A.so->MAIN<-B.so<-libldap_r.so