問題タブ [nm]
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 - ライブラリ間のgcc未定義の参照
リンク時に、次の情報が表示されます。
使用してみると間違いなく見られますnm --defined-only libSystem.a
libSystem.aとlibMain.aの両方が適切に入力されています。リンカーのコマンドラインオプション:
-o "Game.so" -shared -Wl、-z、noexecstack "-lstdc ++" "-lsupc ++" "-lgnustl_static" "-lgcc" "libSystem.a" "libMain.a" -nostdlib -l "c"- l "m" -l "log" -l "gcc" -Wl、-soname、 "libGame" -Wl、--no-undefined
c - nmコマンドのようにシンボルのタイプを表示するにはどうすればよいですか?
現在、ELF形式を勉強しています。単純なnm関数(オプションなし)をコーディングする必要があります。シンボルの値とシンボルの名前を出力にすでに印刷しています。
nm出力は次のとおりです。
私は同じものを持っていますが、「タイプ」はありません。次のように、ELF64_Sym構造を使用しています。
st_info変数とこのマクロを使用する必要があることを知っています:
シンボルのタイプを取得します。ただし、シンボルタイプは次のようにマクロにすることができます。
そして、私が知りたいのは、これらのマクロからnmで印刷された文字をどのように取得できるかです。例:
gcc - 明らかに存在する未解決の OpenSSL シンボルの束を参照するエラーですか?
別のライブラリ (「bar」と呼びます) を利用する共有ライブラリ (「foo」と呼びます) を構築しています。「bar」は、OpenSSL のいくつかの機能を利用します。
ここで問題が表面化します。
「bar」はスタティック ライブラリとしてコンパイルされており、OpenSSL もそうであったようです。したがって、ライブラリ (「foo」) をリンクするときは、次のものを含めます。
- 「foo」のオブジェクトファイル
- 静的ライブラリ
libbar.a
- OpenSSL スタティック ライブラリ
libcrypto.a
とlibssl.a
ビルド コマンドは次のようになります。
ただし、大量のエラーが発生します。
次のコマンドを実行します。
次の出力が生成されます。
したがって、明らかに OpenSSL ライブラリに問題はありません。何がこのようなことを引き起こしたのでしょうか? OpenSSL の構築に使用する 3 つのコマンドを次に示します。
コンパイルプロセスはエラーなしで完了したので、私はまったく困惑しています.
明らかに存在する OpenSSL シンボルの束を参照するリンカー エラーが発生するのはなぜですか?
c - Linux sparc so ライブラリでの名前マングリング
私はいくつかの sparc ライブラリを持っており、実名を持つエクスポート関数のリストが必要です。objdump または nm を使用して、__1cEnameIcopyType6MpnIASN1CTXT_rnLAsn1TObject_4_v_
またはのような名前を取得__1cHsurname2t5B6M_v_
するので、c++filt はそれらをデマングルできません。nm が持っているすべてのスタイル (gnu、lucid、arm、hp、edg、gnu-v3、java、gnat) を試しましたが、結果は同じです。手伝っていただけませんか?
android - android ndk-build未定義の参照ですが、NMはそこにあると言います
編集済み:投稿の最後にある解決策。
NDK r8d、NDK のサンプル プロジェクト hello-jni、および ARM スタンドアロン ツールチェーンでコンパイルされたいくつかの静的ライブラリを使用して、Android 用の共有ライブラリを構築しています。
NDK-BUILD は、未定義の参照について不平を言います。リンカー コマンドとその出力を参照してください。
ただし、NM は、シンボルが実際に存在すると述べています。
簡素化された OBInfo.h:
簡素化された OBInfo.cpp
-Wl,--no-undefined を削除すると、リンカーはエラーなしで終了します。LD ではシンボルが見つからないのに、NM では見つかるのはなぜですか? (ところで: NM は MSYS に由来し、LD はツールチェーンに由来します)
編集: Android.mk LOCAL_STATIC_LIBRARIES 変数で静的ライブラリの順序を変更する問題を解決しました。また、ビルド済みライブラリの一部を再コンパイルしました。これは、最適化なしで -O0 でコンパイルされたものもあれば、-O2 で最適化されたものもあったためです。
c - 奇妙なリンク動作と未定義のシンボル
(奇妙なプロセス、mpicc + Cython + などを介して) 外部ライブラリをリンクしていますが、リンク手順の動作がおかしいです。
libpetsc4py.o と PETSc.o の 2 つの .o ファイルがあり、.so ファイル PETSc.so にリンクされています。
1 つに未定義のシンボルが含まれています__pyx_tp_new_8petsc4py_5PETSc_Object
別の .o ファイルで定義されています。
次に、リンクが完了します(コンパイル行が変です、ごめんなさい)
しかし最後に、結果のファイルには同じ名前の 2 つのシンボルがあり、そのうちの 1 つは未定義で、すべてが機能しません。
私は何を間違っていますか?同じ名前のシンボルが 2 つあるのはなぜですか?
c - 関数アドレス gcc を手動で設定する
組み込みシステムで使用される動作するバイナリがあります。今、私はそれに何らかのパッチを書きたいと思っています。パッチは、メイン プログラムの下の RAM にロードされ、メイン プログラムから呼び出されます。問題は、パッチから使用されるいくつかの関数の手動で設定されたアドレスを使用するようにgccに指示する方法です。言い換えれば、古いコードには機能sin()
があり、 nm を使用しsin()
て古いコードのアドレスを見つけることができました。パッチを適用したコードsin()
(またはメイン プログラムの何か) を使用しsin()
、パッチを適用したコードをリンクしている間、関数の静的アドレスを使用するように gcc (または ld またはその他のもの) に指示したいと考えています。出来ますか?
c - C89規格とC99規格の実行ファイルサイズの違い
GCC を使用して実行可能ファイルを作成しました
そして、私はこれをします
プログラムのテキスト サイズに違いが生じた原因は何ですか?考えられる理由は何ですか?
c - バイナリで .dtors と .ctors が見つかりません
私は「ハッキング、搾取の技術」という本を読んでいます。この本には、 と の使用法を説明するセクションが.dtors
あり.ctors
ます。
本の演習の 1 つを再現しようとしていますが、実行可能ファイルにはこのセクションがありません。最初は、問題は 64 ビット用にコンパイルしていることだと思っていましたが、現在は 32 ビット用にコンパイルしていて.dtors
、.ctors
まだセクション テーブルに表示されていません。コードは次のとおりです。
私はコンパイルしています:
これは次の出力ですnm
。
objdump
show.dtors
またはどちらの出力も.ctors
多分セクション__init_array_end
は、__init_array_start
またはの動作に__do_global_dtors_aux
関連していますか?.ctors
.dtors