問題タブ [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 - ld:gcc /clang-staticフラグを指定したOSX10.6の-lcrt0.oのライブラリが見つかりません
次のプログラムを作成しようとすると、次のようになります。
OS X 10.6.4では、次のフラグがあります。
これを返します:
他の誰かがこれに遭遇したことがありますか、それとも他の誰もまだ影響を受けていないものですか?修正はありますか?
ありがとう
assembly - 32ビットLinuxアセンブリ-ファイルをリンクする(gasとld)
strlenという関数を作成しました。
私はこれを次のように組み立てました:
次に、これにリンクしたいargvを出力するプログラムをasmで作成しました。同じように組み立てました。次に、実際のプログラムでstrlenを使用できるように、それらをリンクします。私は試した:
しかし、それは次のようになります。
本当にシンプルなものが欠けているに違いありません。ありがとう!
macos - Mac: 実行可能ファイルからシンボルをエクスポートするには?
dlopen() (Windows では LoadLibrary()) を使用して共有ライブラリを動的にロードする実行可能ファイルを作成しています。共有ライブラリは、実行可能ファイルのシンボルを使用します。
Windows ではこれが可能です。実行可能ファイルはシンボルをエクスポートできます。declspec(dllexport) と .def ファイルの両方が機能します。リンカーは、.exe を作成するときに .lib ファイル (「インポート ライブラリ」) も作成するため、DLL はその .lib とリンクするだけで済みます。
Linux では、これも可能です。実行可能ファイルをビルドするときに -Wl,-export_dynamic を渡し、そのシンボルをエクスポートします。
Mac OS X では、代わりに... -Wl,-export_dynamic は機能しませんが、-Wl,-exported_symbols_list があり<filename>
ます<filename>
。しかし、共有ライブラリを構築するのはそれほど簡単ではありません。リンカは未解決のシンボルについて文句を言います。
私はハックを試みました:実行可能ファイルの名前を lib <executable>
.dylib に変更し、共有ライブラリをリンクするときに -l を渡し<executable>
ました。しかし、「メインの実行可能ファイルとリンクできません」というエラーが表示されます。
一般的な問題は、Windows と Mac OS X では許可されていないのに対し、Linux 共有ライブラリには未解決のシンボルが含まれる可能性があることです。しかし、Windows には依存関係に対してシンボルを解決するための「インポート ライブラリ」があり、Mac OS X にはないようです...
これは Mac OS X でどのように解決できますか? 「インポート ライブラリ」に相当するものはありますか (.dll の作成時に Windows リンカによって作成されるスタブ ライブラリです。そのため、モジュールが .dll に動的にリンクする必要がある場合は、「インポート ライブラリ」に対してリンクされます)。または他の解決策はありますか?
linux - Linux で gcc を使用したインクリメンタル リンク。出来ますか?
私のチームのプロジェクトの開発方法では、すべての.o
オブジェクト ファイルからアプリケーション用の共有オブジェクト ライブラリを生成します。私の仕事 (うまくいけば、それは十分に具体的であると同時に、他の人に役立つほど一般的でもあります!) は、実行可能ファイルが最後に作成されてから変更されたオブジェクト ファイルのみをリンクすることです。たとえば、.so のビルドに使用するコマンド ラインは次のとおりです。
これは期待どおりに機能します。:)私の目標は、変更されたオブジェクトファイルのみをリンクできるようにして、同時リンクプロセスを高速化することです。コマンドの例は次のとおりです。
libMySharedLibrary.so
古いオブジェクトファイルも維持しながら、新しいオブジェクトファイルで更新されますlibMySharedLibrary.so
。実際、libMySharedLibrary.so
上記のコマンドで生成すると、すべてのオブジェクト ファイルが含まれている場合よりもファイル サイズが大幅に小さくなっているため、上記のコマンドが意図したとおりに実行されていないことはほぼ確実です。
私の調査を通じて、-i
オプションと同じリンカのオプションがあることがわかりました。これは、-r
すべてのオブジェクト ファイルを 1 つの大きなオブジェクト ファイルに結合するだけのように見えます。残念ながら、これが私が望むものではないようです。
要するに、最初のリンク後に変更されたオブジェクト ファイルのみをリンクして、将来のリンクのリンク プロセスを高速化したいと考えています。これを行う方法はありますか?
編集:私が試したものの例-i/-r
:
コマンド例:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
-nostdlib
タグが必要だと叫ぶのを止めるためにタグを追加する必要があり、-shared
共有オブジェクトは-r
タグで許可されていないため削除しました。
このコマンドは、すべての .o ファイルを 1 つの大きな .o ファイルにまとめるように見えます。したがって、変更された .o ファイルのみを使用して、これからその .o ファイルを更新できれば、それは素晴らしいことです。AllMyObjects.o が最初に作成された後、次のコマンドを試しましたg++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o
: AllMyObjects.o
これは私が小さな間違いを犯している可能性が高いものだと感じています。誰にもアドバイスはありますか?前もって感謝します。
gcc - LD_LIBRARY_PATHとLIBRARY_PATH
単純なC++プログラムを作成していますが、開発とテストのために、システムが提供する共有ライブラリを一時的に最新バージョンに置き換えたいと考えています。
LD_LIBRARY_PATH変数を設定しようとしましたが、リンカー(ld)が次のエラーで失敗しました。
/ usr / bin / ld:-lyaml-cppが見つかりません
ld manページによると、私はそれが機能することを期待していました。
リンカは、次の検索パスを使用して、必要な共有ライブラリを検索します。...ネイティブリンカの場合、環境変数「LD_LIBRARY_PATH」の内容...
次に、LIBRARY_PATHを設定してみましたが、うまくいきました。
GCCマニュアルによると:
LIBRARY_PATHの値は、PATHと同様に、コロンで区切られたディレクトリのリストです。ネイティブコンパイラとして設定されている場合、GCCは、GCC_EXEC_PREFIXを使用してそれらを見つけることができない場合、特別なリンカーファイルを検索するときにこのように指定されたディレクトリを試行します。GCCを使用したリンクでは、通常のライブラリで-lオプションを検索するときにもこれらのディレクトリが使用されます(ただし、-Lで指定されたディレクトリが最初になります)。
(GCC)マニュアルが示唆しているように、私はGCCとリンクしているので、LIBRARY_PATHは機能します。
だが..
- エラーメッセージが示すように、gccとリンクしているので、なぜldが呼び出されるのですか?
- 同じ目的を果たす2つの変数を持つことのポイントは何ですか?他に違いはありますか?
linker - 非.bss初期化されていないデータセクション
カスタムリンカースクリプトを使用して、カーネルイメージを2つの部分に分割しています。1つは通常のコードとデータで、もう1つは初期化コードとデータで、不要になったときに破棄されます。初期化部分もカーネル自体のようにアドレス空間間で共有されないため、fork()がまだ存在する場合(開発のこれらの初期段階にある場合)、そこにあるものはすべてfork()にコピーされます。
起動時に使用する小さなカーネルスタックを割り当てましたが、私が見ることができることから、アドレス空間間で共有される.bssセクション、またはとして保存できないinit領域のいずれかにしか配置できません。初期化されていないデータ。各プロセスが独自のコピーを取得できるように、初期化されていないデータとしてイメージのinit部分に保存したいと思います。
これを行うには2つの方法が考えられますが、それらが可能かどうか、またはリンカーにそれらを行うように指示する方法を見つけることができませんでした。1つ目は、初期化されていない領域を.bss以外のセクションに配置することですが、それが可能かどうかはわかりません。そのようなセクションを混在させることはできないと思います。2つ目は、初期化されていないデータのみを格納する2番目の.bssのようなセクションを作成することです。これは、リンカースクリプトの初期化パットに入れることができます。
何か案は?完全を期すために、私が使用しているリンカースクリプトは次のとおりです。
macos - gdbメモリアクセスの苦情の詳細
as(アセンブラコードから)を使用してコンパイルされたオブジェクトファイルがあります。
ldを使用してリンクすると、 stepi(またはnexti )を実行しようとすると、gdbはアドレス0x0でのメモリアクセスについて文句を言います。gccを使用してリンクすると、すべて問題ありません。
この問題は、 gccのリンク結果と比較して生成されるセクションが少ないldが原因であると推測しています。
実行可能ファイルの何が問題になっているのかを理解できるように、gdbをより詳細に構成する方法はありますか?
PS:実行可能ファイル自体は、両方のバージョンで期待どおりに実行されます。
後で編集:コンパイルに使用したコマンド:
linux - LDを使用して生データ/リソースを実行可能ファイルにリンクする
これまで、私は常に MSVC++ の下でリソースを使用してプログラム内から生データにアクセスしてきました。リンカを直接操作したことはありませんでしたが、今では Linux の下にあり、クロスコンパイラを使用して生成しています。エルフファイル。友人と私はおもちゃの OS に取り組んでいます。
ある時点で達成する必要があることの 1 つは、かなり大きな任意の生データを実行可能ファイルにリンクすることです。データを実行可能ファイルの末尾近くに配置し、その生データへのポインターも取得できるようにする必要があります。GRUB がブート時にカーネルをメモリーにロードしていることは、おそらく注目に値するでしょう。
以前のアイデアの 1 つは、データを C ソース ファイルに変換するプログラムを作成し、データをバイト配列として表現することでした。
洞察はありますか?恐ろしい詳細は必要ありません。何をする必要があるかの大まかな概要だけです。おそらく、リンカー スクリプトに変更を加える必要があると思います。
c++ - omnetpp で独自のモジュールを構築する際の問題
omnetpp の inetmanet フレームワークに含まれる UDP モジュールを使用してアプリケーションを作成しようとしています。問題は、含める必要のあるファイルがリンク段階に含まれないことです。
エラーは次のとおりです。
opp_makemake
作る
なぜそれらが含まれるのか本当にわかりません。モジュールは正常にコンパイルされますが、リンク段階で「未定義の参照」が発生します。
何か案が?
c++ - Linux 上の Lua C++ 開発ファイル (/usr/bin/ld: -llua5.1 が見つかりません)
Lua スクリプト エンジンを組み込んだ C++ アプリケーションを構築しています。Linux(Ubuntu)で開発しています。
私はすでに開発マシンにLuaをインストールしています(lua5.1パッケージをインストールすることにより)。Lua インタプリタを (cmd ライン経由で) 正常に実行できます。
ただし、ビルド時に次のリンク エラーが発生します。
/usr/bin/ld: -llua5.1 が見つかりません
Ubuntu フォーラム/パッケージ リポジトリなどを検索しましたが、必要なパッケージが見つからないようです。誰でも助けることができますか?
PS: tolua++ の開発ファイルもインストールする必要があります (必要な Ubuntu パッケージもわかりません)。
私はUbuntu 10.0.4を使用しています