タグ付けされた質問 「ld」

4
-Wl、-rpath -Wl、
便宜上、以下の関連するマンページを追加しました。 私の(誤)最初の理解:オプションを ,で、それは2番目の-Wlオプションが別のオプションではないこと,を意味し-rpathます。 どうすれ-rpathば-Wl,.議論できるのかわかりません! 私の心の中で理にかなっているのはこれでしょう: -Wl,-rpath . これにより、現在のディレクトリ引数を指定して-rpathリンカーオプションが呼び出されます。 man gcc: -Wl、オプション オプションをオプションとしてリンカーに渡します。オプションにコンマが含まれている場合、コンマで複数のオプションに分割されます。この構文を使用して、オプションに引数を渡すことができます。たとえば、リンカーに-Wl,-Map,output.map渡し -Map output.mapます。GNUリンカーを使用する場合、 `-Wl、-Map = output.map 'でも同じ効果が得られます。 man ld: -rpath = dir ランタイムライブラリの検索パスにディレクトリを追加します。これは、ELF実行可能ファイルを共有オブジェクトにリンクするときに使用されます。すべての-rpath引数は連結され、実行時リンカーに渡されます。実行時リンカーは、それらを使用して実行時に共有オブジェクトを見つけます。-rpathオプションは、リンクに明示的に含まれている共有オブジェクトに必要な共有オブジェクトを見つけるときにも使用されます。
244 gcc  ld  rpath 

1
.so、.la、および.aライブラリファイルの違いは何ですか?
私は.soファイルが一種の動的ライブラリであることを知っています(多くのスレッドがそのようなライブラリを共有できるため、メモリに複数のコピーを保持する必要はありません)。しかし、違いは何である.aとは.la?これらはすべて静的ライブラリですか? 動的ライブラリに静的ライブラリよりも大きな利点がある場合、なぜ静的ライブラリがまだたくさんあるのですか? また、ライブラリ(両方の種類)をロードするための基本的なメカニズムと、ライブラリのコードがどこかで使用されたときにどのように呼び出されるかについても知りたいです。カーネルのどの部分を調べればよいですか?そして、プロセスがどのように実行されているかを知るために、関連するどのLinuxコマンド/ユーティリティを知っておくべきですか?(私はld今までにコマンドを知っています) いつ、.soまたはにコードをビルドする必要があり.aますか?どちらがいいですか? [mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l total 96 -rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a -rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la -rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so -rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a -rwxr-xr-x 1 mirror …

3
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つの変数が同じ目的を果たしている意味は何ですか?他に違いはありますか?
159 gcc  g++  ld 


17
コンパイルの問題:crt1.oが見つかりません
開発に使用している仮想Debianシステムがあります。 今日はllvm / clangを試してみたかった。 clangをインストールした後、古いgプロジェクトを(gccで)コンパイルできません。これはエラーです: ... /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: cannot find crti.o: No such file or directory collect2: ld returned 1 exit status ... clangをアンインストールしましたが、それでも機能しませんでした。 誰も私がこれを修正する方法を知っていますか?
114 gcc  clang  ld 

11
GCCとldで未使用のC / C ++シンボルを削除する方法は?
実行可能ファイルのサイズを大幅に最適化する必要があります(ARM開発)と、現在のビルドスキーム(gcc+ ld)で未使用のシンボルが削除されないことに気付きました。 arm-strip --strip-unneeded結果の実行可能ファイル/ライブラリのの使用は、実行可能ファイルの出力サイズを変更しません(私には理由がわかりません、たぶんそれができないのかもしれません)。 使用されていないシンボルが結果のファイルから削除されるように、ビルドパイプラインを変更する方法(存在する場合)は何ですか? 私もこれについては考えていませんが、現在の組み込み環境は非常に「強力」ではなく500K、2M結果を保存しても、ロードパフォーマンスが非常に向上します。 更新: 残念ながら、gcc私が使用する現在のバージョンには-dead-stripオプションがなく、-ffunction-sections... + --gc-sectionsfor を使用してもld、結果の出力に大きな違いはありません。 gcc + ld未使用のシンボルを自動的に取り除く必要があると確信していたので、これが問題になることにもショックを受けました(なぜそれらを保持する必要があるのですか?)。
110 c++  c  gcc  ld  strip 

1
-rpathと-Lの違いは何ですか?
gccまたld、ライブラリの検索パスを指定する多くの方法を提供します。その中には-rpath、-Lフラグがあります。マンページは、これら2つのフラグの違いを明らかにしておらず、事実上、各フラグがライブラリをライブラリ検索パスに追加すると述べています。しかし、両方のフラグがまったく同じことをするのは奇妙に思えます。これら2つのオプションの違いは何ですか?

2
2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合します
2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合するにはどうすればよいですか? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o c.o $ gcc c.o other.o -o executable ソースファイルにアクセスできる場合、-combineGCCフラグはコンパイル前にソースファイルをマージします。 $ gcc -c -combine a.c b.c -o c.o ただし、これはソースファイルに対してのみ機能し、GCCは.oこのコマンドの入力としてファイルを受け入れません。 通常、.oリンカの出力を入力として使用できないため、ファイルのリンクは正しく機能しません。結果は共有ライブラリであり、結果の実行可能ファイルに静的にリンクされません。 $ gcc -shared a.o b.o -o c.o $ gcc c.o other.o -o executable $ …

1
--start-groupおよび--end-groupコマンドラインオプションとは何ですか?
これらのコマンドラインオプションの目的は何ですか?次のコマンドラインの意味を解読するのを手伝ってください: -Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib どうやらそれはリンクと関係があるようですが、GNUマニュアルは正確にグループ化が意味することを静かにしています。
83 gcc  linker  ld 

2
`fcntl64`の代わりに古いlibc` fcntl`へのリンクを強制する方法は?
そうです(2018年8月発売)GLIBC 2.28は fcntlのにかなり積極的な変更を行いました。定義が変更され<fcntl.h>、外部関数ではなくなりました。なく、#definefcntl64。 その結果、このglibcを使用するシステムでコードをコンパイルした場合、つまりfcntl()を使用した場合、結果のバイナリは2018年8月より前のシステムでは実行されません。これは、さまざまなアプリケーションに影響します。 .fcntl()のマニュアルページは、サブ関数の小さなユニバースのエントリポイントであることを示しています。 https://linux.die.net/man/2/fcntl 必要なGLIBC関数の特定のバージョンをリンカーに伝えることができれば、すばらしいでしょう。しかし、私が見つけた最も近いものは、別の投稿への回答で説明されているこのトリックでした: 「.soファイル内の古いシンボルバージョンに対するリンク」への回答 これはもう少し複雑です。 va_listを取るa fcntlなしの可変vffcntl個です。このような状況では、可変個関数の呼び出しを転送できません。:-( 意図的に低い依存関係を持つ安定したコードがある場合、それを現在のUbuntuでビルドするのは失望です...そして、実行可能ファイルを1年前にリリースされた別のUbuntuで実行することを拒否します(ほぼその日まで)。これにはどのような手段がありますか?

4
Xcode 11 ldエラー「あなたのバイナリは/usr/lib/libcrypto.dylibの許可されたクライアントではありません」
私のプロジェクトはCMakeを使用してビルドしますが、Macでビルドするときは、ローカルのmacOSバージョンのclangとldを使用します。 macOS 10.15 CatalinaでXcode 11にアップグレードした後、次のエラーでリンクできません:ld: cannot link directly with dylib/framework, your binary is not an allowed client of /usr/lib/libcrypto.dylib for architecture x86_64。 これは新しいアプリの公証に関連していますか?プロジェクトがXcodeである必要がない修正(CLionを使用してmacOSで開発している)や、独自のOpenSSLビルドをリンクする必要がない修正はありますか? 助けてくれてありがとう。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.