問題タブ [ld]
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.
macos - Mac OS X で UnitTest++ をビルドすると、「ld: in libUnitTest++.a, archive has no table of contents」が表示されるのはなぜですか?
UnitTest++ バージョン 1.4 を ( http://sourceforge.net/projects/unittest-cpp/から) ダウンロードして make すると、次のようになります。
同じバージョンの gcc (4.2.1) を使用している同僚の Mac では、このエラーは発生しません。(注: 同僚が作成した libUnitTest++.a を使用できるので、ブロックされませんが、それでもこの問題のトラブルシューティングを行いたいと思います。)
私はGoogle検索を行いましたが、他の同様の問題を解決したようranlib
ですが、 libUnitTest++.a が作成されていないため、実行できませんranlib
。
gcc - 共有ライブラリのダイナミック リンカー パスを設定するには?
.interp
共有ライブラリをセグメントでコンパイルしたい。
次のコマンドを使用しています。
オプションを渡さなかったかのように、INTERP セグメントなしで終了し--dynamic-linker=blah
ます。で確認してくださいreadelf -l test.so
。実行可能ファイルをビルドするとき、リンカーはオプションを正しく処理し、INTERP セグメントをプログラム ヘッダーに配置します。共有ライブラリでも機能させるにはどうすればよいですか?
linux - 同じ名前の共有ライブラリが存在する場合、静的ライブラリとのリンクを強制するにはどうすればよいですか?
で定義されている関数をmain.cpp
使用するファイルがあるとします。また、同じディレクトリでlibmath.aとlibmath.soの両方を使用できるとします。ここでコマンドを発行すると、Linuxのデフォルトの動作は共有ライブラリにリンクすることです。共有ライブラリを削除または移動せずに、プログラムを静的ライブラリに強制的にリンクさせる方法はありますか?sin()
libmath
g++ -o main main.cpp -lmath
libmath.so
libmath.a
macos - リンカー (ld) は、debuginfo を使用してコンパイルすると Mac OS X でクラッシュしますが、デバッグ情報なしで正常に動作します。
私は Snow Leopard マシン (10.6.5) で作業しており、C++ アプリケーションのバグを探しています。ただし、リンカーがクラッシュするため、g++ -O0 -g でアプリをビルドできません。
2 つのクラッシュは、「-arch」フラグが 2 つあるためだと思います。クラッシュが発生したと書かれたコアファイルを取得しました
このヒントに従って、コンパイラ フラグから「-g」を削除すると、すべて正常にビルドされます。さらに、私たちのもののほとんどは '-g' で問題なくビルドされますが、2 つの大きなモジュール (.dylibs) だけがビルドされないため、それらのデバッグ情報が残っていません。そして、皮肉なことに、バグはこれらの dylib の 1 つに潜んでいます。
このバグは、初期化されていないメモリの使用が原因である可能性が最も高く、valgrind でアプリを実行すると、初期化されていないメモリ参照がいくつかあることがわかりますが、debuginfo がないため、モジュール XXX ( dylib "-g" でコンパイルできない)
そこで、Apple のオープン ソース Web サイトから ld ユーティリティをダウンロードしようとしましたが、Apple が提供しない Mac 固有のバージョンの libunwind への依存関係が欠落しているため、ビルドできないことがわかりました (あの男のように)。あちらへ。したがって、リンカーを再コンパイルできません。
次の質問は、今何をすべきかということです。Macサポートへの連絡を本当に避けたかった...
ld バージョンは「ld64 97.17」、XCode は 3.2.5、gcc は 4.0.1 です。
私は本当にいくつかの指示が必要です...
xcode - リンカーの警告 - 異なるターゲット トリプルの 2 つのモジュールをリンクする
このリンカ警告が表示されました:
深刻に聞こえますが、私にははっきりとはわかりません。
何が問題で、どうすればよいですか?
ところで、私は Xcode 3.2.5 と LLVM Compiler 1.6 を使用しています。
前もって感謝します。
linux - CocotronCDTを使用してSDLとリンクする
私はCocotronを使用してXcodeでLinux用にコンパイルしようとしています。すべてがFoundationでうまく機能していますが、SDLも使用しようとしています。Linux(Ubuntu)からライブラリをコピーしましたが、リンクに問題があります。
libpulse-simpleもコピーしましたが(そして、おそらく意味があると思ったすべてのディレクトリに配置しました)、それでもこのエラーを取り除くことができませんでした:
c++ - 共有ライブラリのロード中にエラーが発生しました:libboost_system.so.1.45.0:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません
LinuxでC++実行可能ファイルを作成しています。実行可能ファイルは、いくつかのBoostライブラリにリンクしています。
これは、バイナリを実行しようとしたときの出力です。
次に、バイナリでlddを実行して、依存関係を確認します。
liboos_system.sl.1.45.0SOが見つからない理由がわかりません。今日は少し前にうまく構築しました。誰か説明できますか?
linux - Linux、GNU GCC、ld、バージョン スクリプト、および ELF バイナリ形式 -- どのように機能しますか?
Linux でのライブラリのバージョン管理と、それをすべて機能させる方法についてもっと学ぼうとしています。コンテキストは次のとおりです。
- 同じインターフェイス セットを公開する動的ライブラリの 2 つのバージョンがあります。たとえばlibsome1.so
、 とlibsome2.so
です。
-- アプリケーションが に対してリンクされていlibsome1.so
ます。
-- このアプリケーションはlibdl.so
、別のモジュールを動的にロードするために使用しますlibmagic.so
。
-- 現在libmagic.so
は に対してリンクされていlibsome2.so
ます。明らかに、リンカー スクリプトを使用して のシンボルを非表示にしないlibmagic.so
と、実行時に のインターフェイスへのすべての呼び出しlibsome2.so
が に解決されlibsome1.so
ます。libVersion()
これは、マクロの値に対してによって返される値をチェックすることで確認できますLIB_VERSION
。
-- それで、次に、で定義されエクスポートさlibmagic.so
れる 3 つのシンボルを除くすべてのシンボルを非表示にするリンカー スクリプトを使用してコンパイルおよびリンクを試みます。libmagic.so
これは機能します...または、少なくとも値が一致libVersion()
しLIB_VERSION
ます(そして、バージョン1ではなくバージョン2が報告されます)。
-- ただし、一部のデータ構造がディスクにシリアライズされると、いくつかの破損に気付きました。libsome1.so
アプリケーションのディレクトリで、 を指す場所にソフト リンクを削除して作成するとlibsome2.so
、すべてが期待どおりに機能し、同じ破損は発生しません。
これは、実行時リンカーによるシンボルの解決における競合が原因である可能性があると思わざるを得ません。libsome2.so
すべてのシンボルが関連付けられるようにリンクしようとするなど、多くのことを試しました(コマンドがまだシンボルを asと notとしてリストsymbol@@VER_2
しているため、まだ混乱しています)...何も機能していないようです!!! ヘルプ!!!!!!nm -CD libsome2.so
symbol
symbol@@VER_2
編集: 先に述べておくべきでしたが、問題のアプリは Firefox であり、libsome1.so
同libsqlite3.so
梱されています。それらを再コンパイルするオプションはまったくありません。また、バージョン スクリプトを使用してシンボルを非表示にすることが、現在のところ唯一の解決策のようです。では、シンボルが隠されていると実際に何が起こるのでしょうか? それらは SO に対して「ローカル」になりますか? rtld はそれらの存在を認識していませんか? エクスポートされた関数が非表示のシンボルを参照するとどうなりますか?
gcc - ld スクリプトのセクション定義の最後にある =0 とはどういう意味ですか?
最後に =0 のセクション定義を見ました。
最後の =0 は何を意味し、その意味は何ですか?
gcc - 共有オブジェクトのリンカー名への GCC リンク
私が持っているとします:
/usr/lib/libsomething.so.1
マシン A;/usr/lib/libsomething.so.2
マシン B で。
両方のマシンには/usr/lib/libsomething.so
、それぞれのライブラリへのシンボリック リンクがあります。
gcc
with -lsomething
(または)を使用してリンクする/usr/lib/libsomething.so
と、シンボリック リンクがたどらldd
れ、マシン A では次のようなものが生成されます。
これは、マシン B でライブラリを見つけることができないことを意味します。
これらはメジャー バージョン番号の変更であり、互換性がない可能性があることはわかっていますが、そのリスクを冒しても構わないと思っています。リンカに伝えたいのは、 を探すことですlibsomething.so
。シンボリックリンクをたどらないので、ldd
表示されます
Aでしかし
B.そして、ローダーはそこにあるバージョンへのシンボリックリンクをたどります。
また、dlopen などで読み込みを遅らせたくありません。コンパイル時に共有オブジェクトにリンクしたい。
これは可能ですか?