問題タブ [ldd]
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.
gcc - SO を libbfd にリンクする
人間が読めるバックトレースを得るために、SO を libbfd にリンクする必要があります。
-fPIC でコンパイルされていないため、libbfd.a に対する静的リンクは失敗します。そのため、私が理解しているように、実行可能ファイルにのみ参加できます。
libbfd.so へのリンクもいくつかの問題を引き起こしますが。
Ubuntu-14.04 と Debian Wheezy 7.8 の両方でコンパイルする必要があり、それらには交差しない binutils バージョンのセットがあります。特に、Ubuntu には 2.24 があり、Debian には 2.22 と 2.25 があります。そして問題は、gcc がシンボリックリンクの名前 libbfd.so を参照に使用したくないため、代わりに SONAME を使用することです。したがって、依存関係で libbfd-2.24-system.so または libbfd-2.25-system.so のいずれかで終了します。
今のところ、いくつかのアプローチがあります。
リンク中に SONAME をオーバーライドできる隠しフラグがいくつかあります。これは優先パスです
libbfd を手動でコンパイルする以外に方法はありません。私はこれを可能な限り回避します。
私が必要とするすべての手動dlopen + dlsym。
answer gcc link shared library に対して symbolic linkを読みましたが、変更できない SONAME を提案しています。
助言がありますか?
ありがとう。
編集:事実上、Ubuntuリポジトリのすべての静的ライブラリは位置に依存していないようです。理由はわかりません。SONAME をオーバーライドできないため、事態はさらに複雑になります。
c - ライブラリで使用されているライブラリのリストを取得する
私は自分のマシンでライブラリ " A " をコンパイルしようとしています & 私は "C" と "D" のA のオプションの依存関係を標準パスとローカル/カスタム パスにインストールしています。カスタム パス ( -O3 ) のライブラリは標準パス ( -O0 ) のライブラリと比較して、より最適化されています。
LDFLAGS(-L) および LIBS (-l) を使用してローカル ライブラリのパスを指定して、ライブラリ「A」をコンパイルします。ライブラリが生成されます (libA.so または libA.a)!
ldd は、実行可能ファイルに対してリンクされたライブラリを確認できるツールです。
- どのライブラリがライブラリに対してリンクされているかを知ることができる同等のツールはありますか (すなわち ldd libscalapack.a )?
- ライブラリ A( libA.so/libA.a ) の作成中にオプションのライブラリ ライブラリが使用されたことを確認する方法はありますか?
- コンパイル中に標準ライブラリとローカル ライブラリのどれが使用されたかを確実に確認する方法はありますか?
返信をお待ちしております。
shared-libraries - Linux ELF ファイル: インポートされた関数に属する共有オブジェクトを取得する方法
たとえば、動的にリンクされた ELF バイナリがあるとします/bin/less
。
バイナリ内には、共有ライブラリによって提供される関数への呼び出しがあります。たとえば、strcpy()
strcp
関数がどの共有ライブラリ/共有オブジェクトから取得されているかを調べるにはどうすればよいですか? つまり、func_name/shared_obj_name.so のペアを取得したいのです。
この投稿に答えて、Michael Slade は次のように書いています。
ELF ファイルは、どのシンボルがどのライブラリから来たのかを指定しません。リンク先の共有ライブラリのリストを ELF バイナリに追加し、リンカがライブラリ内のシンボルを検索できるようにするだけです。
それでも、必要な情報を (リンカを使用して) 収集する方法が必要です。私の場合、バイナリを実行して ltrace することはオプションではありません。私がこれまでに試したこと:
objdump -T /bin/less | grep strcpy
私は私に与えることを試しました:
これは明確ではなく、ファイルの名前も教えてくれません.so
。
実行中ldd /bin/less
、戻り:
「GLIBC_2.2.5」が対応していると思いますlibc.so.6
(インポートされた) 関数に対応する共有オブジェクト (.so ファイル) をプログラムで見つけるにはどうすればよいですか?
linux - bash スクリプトで ldd --version を抽出する
出力を抽出して glibc のバージョンを確認しようとしていldd --version
ます。Ubuntu マシンの例を次に示します。
そして、これは CentOS 6.5 マシンからの別のものです。
ありがとうございました、
クリス
linux - "main()" の前に実行される LLVM IR のコードは?
どのLLVM IRコードが前に実行されるかについての一般的なルールを知っている人はいますmain
か?
Clang++ 3.6 を使用すると、オブジェクト ファイルの「.text.startup」セクションの関数を介してグローバル クラス変数のコンストラクターが呼び出されるようです。例えば:
この例から、 を指定する IR 関数定義を正確に探す必要があると思いますsection ".text.startup"
。
私の理論が正しいと疑う理由は 2 つあります。
LLVM IR ファイルには他に何も表示されません (
.ll)
LLVM が「__cxx_global_var_init」のような C++ 固有の関数名をスニッフィングしていないと仮定する場合、グローバル オブジェクト コンストラクターを最初に実行する必要があることを示唆しています。したがってsection ".text.startup"
、唯一の明白な手段はmain()
しかし、それが正しいとしても、関数を の前に実行させるための十分な条件を特定しましたが、それmain()
が LLVM IR で関数を の前に実行させる唯一の方法であることを示していませんmain()
。Gnu リンカは、場合によっては、セクションの最初の命令を
.text
プログラムのエントリ ポイントとして使用します。 Raspberry Pi プログラミングに関するこの記事では、コードを最初に実行する手段として、.text.startup
コンテンツをプログラムのセクションに表示される最初のコード本体にする方法について説明しています。.text
.text.startup
残念ながら、私の理論を裏付けるものは他にあまり見つかりません。
文字列「.startup」の LLVM 3.6 ソース コードを grep すると、LLVM コードの CLang 固有の部分でしか見つかりません。私の理論が正しいとすれば、LLVM コードの他の部分でもその文字列が見つかったはずです。特に、C++ フロントエンド以外の部分です。
C++ でのデータ初期化に関するこの記事は、".text.startup" に特別な役割があることを暗示しているようですが、Linux プログラム ローダーが実際にその名前のセクションを探すとは言えません。あったとしても、プラットフォームに中立な LLVM IR で特別な意味を持つ Linux 固有の可能性のあるセクション名を見つけたら驚くでしょう。
Linux 3.13.0 のソース コードには文字列 ".startup" が含まれていないようです。これは、プログラム ローダーが ".text.startup" という名前のセクションをスニッフィングしていないことを示唆しています。