問題タブ [dynamic-linking]

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.

0 投票する
2 に答える
2630 参照

python - Python拡張機能(.pyd)を別の拡張機能に動的にリンクする

Python拡張モジュールは単なるダイナミックライブラリなので、Python拡張を別の拡張に動的にリンクできると思います。問題はWindowsにあります。Python拡張機能にはの.pyd代わりに拡張機能が与えられている.dllため、セットアップスクリプトを実行するときにdistutilsをそれらにリンクさせることができません。(Python拡張機能はファイル拡張子を使用するため、これはUNIXでは問題ではないと思い.soます。)

bar.pydにリンクする必要のある拡張子があると仮定しfoo.pydます。基本的に、セットアップスクリプトで行ったことは次のとおりです。

これまでのところ、これは機能していません。これも可能ですか?そうだと思いますが、オンラインで何も見つかりませんでした。私はWindowsでMinGWを使用していますが、これを別のMSVC++や他のシステムでも動作させたいと思います。

編集:以前は、コンパイル時に作成されたオブジェクトファイル(foo.o)を拡張機能のオプションに渡すことでこの問題を解決しました(これは、ですべてのシンボルのプロトタイプを定義した場合にのみ機能します):fooextra_objectsfoobar

これは正しい解決策ではなかったようですが、うまくいきました。私はダイナミックリンクをよく理解していないので、これはそれを行う正しい方法かもしれません。しかし、それは非常に間違っていると感じます。

次に、いくつかの明示的な引数をgccに渡して、インポートライブラリをコンパイルするようにしました。

bar次に、新しいインポートライブラリにリンクしました。

これは文句なしにコンパイルされましたが、いくつかのシンボルにいくつかの問題がありました(具体的には、で再定義されたように見えるいくつかPyTypeObjectfooグローバルがありましたbar。両方のモジュールのが同じ定義を参照する必要がありPyTypeObjectます)。

編集2:それで、私は問題を選び出しました。インポートライブラリをビルドしてリンクした後、関数シンボルは正しくエクスポートされていましたが、PyTypeObjectsが再宣言されていました。にがあったと仮定PyTypeOject Foo_Typefooます。私はそれをで宣言しました、それはとの両方にfoo.h含まれていました:foo.cbar.c

私はそれを取り出して、これを上部近くに置きましたfoo.c

そしてこれは上部近くにありbar.cます:

これで問題は解決しました。次に、両方fooでFoo_Typeを使用でき、Foo_Typebarの同じ定義を参照しました。問題は、これがWindows以外のシステムでは機能しないことです。__declspecsを取り出すだけで、他のシステムでも問題なく動作すると思います。

0 投票する
2 に答える
3638 参照

c - Windows での -R および -rpath スイッチとのリンク

私は、Windows XP で gcc コンパイラ (MinGW) を使用しています。.dll ライブラリを作成しましたlibdir.dllが、そのライブラリを使用するプログラムをビルドしようとしました。
その .dll ファイルを System または System32 フォルダーに入れたり、PATH 変数にパスを設定したりしたくありません。その情報をプログラム自体に提供したいのです。とスイッチが利用できる
ことはわかっているので、そのうちの 1 つにリンクするつもりでした。-R-rpath

最初の -rpath:
gcc -L /path/to/lib -Wl,-rpath, /path/to/lib main.o -ldir -o prog

-R より:
gcc -L /path/to/lib -Wl,-R, /path/to/lib main.o -ldir -o prog

これは正常にリンクされますprogが、プログラムを起動すると Windows が見つからないというメッセージを出力しますlibdir.dll
私の質問は、何がうまくいかなかったのか、libdir.dll適切なスイッチを使用している場合でも実行時にパスが不明なのはなぜですか?

libdir.dll の独自のコピーを含む prog1 と prog2 があり、両方がライブラリにコードをロードすると同時に実行を開始するとします。コピーして両方のプログラムに使用しますか?
2 番目の質問は、ライブラリがどのようにロードされるか (任意の OS) に関するものです。リンカは常にライブラリ全体をロードしますか、それとも必要な部分だけをロードしますか?たとえば、プログラムfoo()がライブラリ内の関数を参照する場合、リンカは最初にその関数またはライブラリ全体のみをメモリにマップしますか?

0 投票する
2 に答える
3974 参照

gcc - 共有ライブラリが独自のベースアドレスを取得する方法

すべてのシンボルのオフセット アドレスがあります (libelf を独自のバイナリ .so で実行して取得)。ここで、実行時に、これらすべてのシンボルの絶対アドレスを計算する必要があります。そのためには、ベース アドレス (共有ライブラリが読み込まれる場所) を取得して計算を行う必要があります。

symbol_address = base_address + symbol_offset

共有ライブラリが独自のベースアドレスを取得するにはどうすればよいですか? Windows では、DllMain に渡されたパラメーターを使用しますが、Linux に同等のものはありますか?

0 投票する
4 に答える
69223 参照

c++ - リンカーは何をしますか?

私はいつも疑問に思っていました。コンパイラがあなたが書いたコードをバイナリに変換することは知っていますが、リンカは何をしますか? 彼らはいつも私にとって謎でした。

「リンク」とは何かを大まかに理解しています。ライブラリとフレームワークへの参照がバイナリに追加されるときです。それ以上のことはわかりません。私にとって、それは「うまくいく」だけです。動的リンクの基本も理解していますが、深すぎることはありません。

誰かが用語を説明できますか?

0 投票する
3 に答える
1766 参照

c++ - C++ダイナミックライブラリをリンクするときにレイジーシンボルバインディングが失敗しました

C ++でdylibを作成していますが、それをアプリケーションにリンクしようとすると、実行時にエラーが発生します。

シンボルが剥がれていないことを確認し、

シンボルがライブラリに存在することを報告します。

XCodeの内部からリンクしているので、リンクコマンドはちょっと変です。dylibのリンカーコマンドは次のとおりです。

テストアプリのリンカーコマンドは次のとおりです。

なぜこれが起こっているのか、および/またはそれを修正する方法についてのアイデアはありますか?

0 投票する
2 に答える
203 参照

c++ - dlopen/etc はコンパイルされません。未解決のシンボル

動的なものの使用法を調査しています。dlopenこれまでのところ、 &Co が「未解決」であるため、私のプログラム (main.cpp) はコンパイルしたくありません。私は含めdlcfn.hました。

30分で家に帰らなければならないので(他のことも急いで)、できるだけ早く答えが必要です。

正しいエラー メッセージは「未定義」かもしれませんが、これは私のコンピューターではありません。

0 投票する
6 に答える
375 参照

java - コンパイルされた Java コード間のリンクを確認するにはどうすればよいですか?

一般的に言えば、1 つのコード セット (クライアント コード) が別のコード セット (API コード) とリンクします。Java リンクは通常、コンパイル時に .java と .class の間、または実行時に .class と .class の間で検証されます。ただし、後者の場合、検証は不正な参照に遭遇したときと同じです (つまり、怠惰です)。

コンパイルされたコードを使用して、クライアント コードと API コードの間のすべてのリンクを一度に強制的に検証する方法はありますか? 目的は、クライアント コードが特定のバージョンの API で動作することを確認することです (別のバージョンに対してコンパイルされている場合でも)。

(もちろん、API に対して逆コンパイルして再コンパイルするのも 1 つの方法ですが、もっと直接的な方法はありますか?)

0 投票する
1 に答える
49 参照

php - phpページの動的リンクの結果に追加の/directory/を追加します

ここにまたいます。わざわざするのは嫌いですが、ここに別のジンジャーがあります。

私はカスタムメイドのショッピングカートを持っており、ブラウザで提供されたときに$ nameを製品名に、$pを製品ID番号に置き換える動的リンクをページにいくつか持っています。私はこのようなページ上のリンクを目指しています:http://www.something.com/buy/ProductName/382793/

私が得ているのはhttp://www.something.com/buy/ProductName/0/382793、末尾のスラッシュがないことです。お奨めはスラッシュを持っています。

コードは次のようになります。<a title=\"View Product.\" href=\"http://www.something.com/buy/$name/$p/". $line["PID"]. "\">PRODUCT LINKO</a>

$nameと$pが最後にスラッシュと末尾のスラッシュで区切られていることがわかりますが、機能していません。紳士淑女のアイデアはありますか?

0 投票する
2 に答える
1431 参照

c++ - ダイナミックリンクとPythonSWIG(C ++)はC++で動作しますPythonでは失敗します

SWIGを使用してPythonラッパーを作成したライブラリがあります。ライブラリ自体は、動的にリンクされている.soファイルにあるユーザー提供の関数を受け入れます。現在、私は自分で作成したものを扱っており、動的リンクをC++で機能させることができました。Pythonで実行しようとすると、未定義のシンボルエラーが発生します。これらのシンボルは、提供された.soファイルには存在しないが、メインプログラムには存在するシンボルです(基本的に、これらのシンボルは、提供されたモジュールがメインプログラムからのデータにアクセスできるようにする関数です)。

C ++で短いテストプログラムを実行してもエラーは発生しませんが、このラッパー(以前は機能していました)を使用したPythonでの短いテストプログラムは失敗します。PythonではなくC++で失敗する理由についての説明は考えられません。私が少し心配しているのは、C ++が正しく機能していないが、私に伝えていないという考えです。Pythonは、C++が機能していないというエラーを検出しています。それでも、C ++によって返される結果は正確であるため、これはありそうにないようです。

これがどのように可能であり、したがってどのように修正できるかについての考えはありますか?

ありがとう。

更新:このコードをプログラムの先頭に追加しました:

これによりランタイムエラーが解消されますが、残念ながら2番目の問題が発生する可能性があります(リンクが原因です)。メインプログラムの一部であるダイナミックリンクライブラリ内から呼び出されている関数は、正しい値を返していません。それらは0を返しています。さらに、それらがまったく実行されていないことは明らかです。問題は、実際に何が実行されているのか、なぜそれがC ++と異なるのか、そしてそれをどのように修正するのかということです。

再度、感謝します。

更新-潜在的により明確な説明Pythonは、SWIGによってラップされた私のC++ライブラリであるモジュールをインポートします。このC++ライブラリは、dlopenとdlsymを使用して、ユーザーが指定した.soファイルから関数を取得します。ユーザーは、その仕事をするために、C++ライブラリの一部である関数へのファイル呼び出しを提供しました。.soファイルからC++ライブラリへの関数呼び出しは失敗している部分です。つまり、関数の呼び出しに失敗し、単に0を返します。ただし、この失敗は、テストコードがPythonで記述されている場合にのみ発生します。ライブラリを使用するC++テストコードは正常に機能します。

0 投票する
1 に答える
120 参照

seo - 中間のリンクスルー ページ、良いか悪いか?

非常に複雑な Web サイトの場合、ページをレンダリングするときにターゲット ページの URL を計算するための複雑なロジックを作成せずに、ページ間の内部リンクを作成する方法を検討しています。

たとえば、www.domain.com/nl/holiday/hotels/holiday-inn/にリンクしたい場合、2 つの中間リンクスルー ページを配置することを考えています。www.domain.com/go/hotel/234のようなものは、正しい URL パスを計算してターゲット URL に転送するだけです。これにより、レンダリング中のページですべての翻訳とスラッグ計算を行う必要がなくなり、かなりのリソースと手間を節約できます。

この手法には、注意が必要な欠点がありますか? テクニカルとSEOの両方の観点から?