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

リンカは、コンパイルされたプログラミング言語で記述されたソースコードから実行可能ファイルを生成するためのツールチェーンの一部です。複数のファイルでコンパイルされたオブジェクトコードを受け取り、それらから単一の「リンクされた」実行可能ファイルを生成します。


4
コンパイル済みのバイナリで「rpath」を変更できますか?
スクラップヒープ用にスケジュールされている古い実行可能ファイルがありますが、まだありません。それは私の環境から削除されたいくつかのライブラリに依存していますが、私はそれがうまく機能する場所にいくつかのスタブライブラリを持っています。この実行可能ファイルがこれらのスタブライブラリを指すようにしたいと思います。はい、LD_LIBRARY_PATHを設定できますが、この実行可能ファイルは多くのスクリプトから呼び出されます。多くのユーザーがいるため、1つの場所で修正したいと思います。 私にはこれのソースがなく、入手するのは難しいでしょう。私は考えていました-ELF対応エディターを使用してこのファイルを編集し、rpathに単純なPATHを追加して、新しいライブラリにヒットさせることができますか?これは可能ですか、またはELFバイナリを作成すると、場所に固定して移動できなくなりますか?
92 linux  linker  elf 

5
ライブラリパスの設定を指定する方法は?
私が使用したC ++プログラムをコンパイルしていますg++とld。.soリンク時に使用したいライブラリがあります。ただし、同じ名前のライブラリがに存在し/usr/local/lib、ld直接指定しているライブラリよりもそのライブラリを選択しています。どうすれば修正できますか? 以下の例では、私のライブラリファイルは/my/dir/libfoo.so.0です。私が試したことはうまくいきません: 私のg ++​​コマンドは g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp en`変数の/my/dir先頭または末尾に追加する$PATH /my/dir/libfoo.so.0引数としてg ++に追加する
91 c++  linker  g++ 

5
Linuxダイナミックリンカーからの「バージョン情報がありません」というエラーはどういう意味ですか?
私たちの製品では、「libpam」のようなシステムライブラリに動的にリンクするいくつかのLinuxバイナリを出荷しています。一部のお客様のシステムでは、プログラムの実行時にstderrで次のエラーが発生します。 ./authpam: /lib/libpam.so.0: no version information available (required by authpam) アプリケーションは正常に実行され、ダイナミックライブラリからコードを実行します。したがって、これは致命的なエラーではなく、実際には単なる警告です。 これは、システムにインストールされたライブラリに実行可能ファイルが期待するものがない場合のダイナミックリンカによるエラーだと思います。ダイナミックリンクプロセスの内部についてはよくわかりません...トピックをグーグルで検索してもあまり役に立ちません。:( このエラーの原因を知っている人はいますか?...どうすれば原因を診断できますか?...そして、この問題を回避するために実行可能ファイルを変更するにはどうすればよいですか? 更新:お客様が最新バージョンのDebian「テスト」にアップグレードしたところ、同じエラーが発生しました。したがって、それは古いlibpamライブラリではありません。リンカーが何について不平を言っているのか理解したいと思いますか?根本的な原因などを調査するにはどうすればよいですか?
91 linux  linker 

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 $ …

7
「共有オブジェクトの作成時に `.rodata.str1.8 'に対する再配置R_X86_64_32は使用できません」でコンパイルが失敗する
このソースコードをVPSのメイクファイルからコンパイルしようとしていますが、機能しません。VPSは64セントのOSです これが完全なエラーです # make gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o /usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC …

5
静的ライブラリ、静的にリンクされたダイナミックライブラリ、動的にリンクされたダイナミックライブラリの.libファイルには何が含まれていますか?
静的ライブラリ、静的にリンクされたダイナミックライブラリ、動的にリンクされたダイナミックライブラリの.libファイルには何が含まれていますか? 動的にリンクされたダイナミックライブラリに.libファイルが必要ないのはなぜですか。また、静的リンクでは、.libファイルはすべてのメソッドを含む.objファイルにすぎません。あれは正しいですか?

9
インライン関数の静的変数
ヘッダーファイルで宣言および定義されている関数があります。これはそれ自体が問題です。その関数がインライン化されていない場合、そのヘッダーを使用するすべての変換ユニットは関数のコピーを取得し、それらがリンクされている場合は複製されます。関数をインライン化することで「修正」しましたが、「inline」キーワードを指定してもコンパイラーはインライン化を保証しないため、これは脆弱な解決策ではないかと思います。これが当てはまらない場合は、訂正してください。 とにかく、本当の問題は、この関数内の静的変数はどうなるのかということです。最終的に何部になりますか?

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

4
共有ライブラリ内の未解決のシンボルを簡単にチェックしますか?
私はかなり大きなC ++共有オブジェクトライブラリを書いていますが、デバッグを面倒にする小さな問題に遭遇しました。 ヘッダーファイルで関数/メソッドを定義し、そのスタブを作成するのを忘れた場合(開発中)、実行可能ファイルではなく共有オブジェクトライブラリとしてビルドしているため、コンパイル時にエラーが表示されず、その機能を実装するのを忘れました。私が何かが間違っていることを見つける唯一の方法は、実行時に、このライブラリに対してリンクしているアプリケーションが「未定義のシンボル」エラーでフォールオーバーするときです。 コンパイル時に必要なすべてのシンボルがあるかどうかを確認する簡単な方法を探しています。おそらく、Makefileに追加できるものです。 私が思いついた解決策の1つは、コンパイルされたライブラリを実行してnm -C -U、すべての未定義の参照のデマングルされたリストを取得することです。問題は、GLibCなどの他のライブラリにあるすべての参照のリストも表示されることです。もちろん、最終的なアプリケーションがまとめられると、このライブラリと一緒にリンクされます。の出力を使用することも可能であろうnmとするgrepすべての私のヘッダファイルを通って、対応する名前のいずれかどうかを確認..しかし、これは非常識と思われます。確かにこれは珍しい問題ではなく、それを解決するためのより良い方法がありますか?

3
サイクルを構成/作成するためにインクルードパスとライブラリパスを追加するにはどうすればよいですか?
suにアクセスできないLinuxボックスにライブラリをインストールする場所が必要です。〜/ local [/ bin、/ lib、/ include]を使用していますが、。/ configureにライブラリを探すように指示する方法がわかりません(特に、libgifが必要なemacsをコンパイルしようとしています) 、これは私のディストリビューションには含まれていません)。 追加してみました export PATH=$PATH:~/local/bin export LD_LIBRARY_PATH=~/local/lib export C_INCLUDE_PATH=~/local/include export CPLUS_INCLUDE_PATH=~/local/include .bashrcに変換しますが、機能していないようです。

6
Cの共有グローバル変数
Cで共有されるグローバル変数を作成するにはどうすればよいですか?ヘッダーファイルに入れると、リンカーは変数がすでに定義されていると文句を言います。私のCファイルの1つで変数を宣言し、externそれを使用したい他のすべてのCファイルの先頭に手動でsを配置する唯一の方法はありますか?それは理想的ではないようです。

8
ldをゴールドに置き換える-経験はありますか?
誰かがgold代わりに使用しようとしましたldか? gold よりもはるかに高速であることが約束されているldため、大規模なC ++アプリケーションのテストサイクルを高速化するのに役立つ可能性がありますが、ldのドロップイン代替として使用できますか? することができますgcc/g++直接呼び出しますかgold。? 既知のバグや問題はありますか? が、goldしばらく以来、GNU binutilsのの一部であり、私は、Webでの「サクセスストーリー」、あるいは「ハウツー」はほとんど認められません。 (更新:ゴールドへのリンクとそれを説明するブログエントリを追加しました)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.