GNU/Linux >> Linux の 問題 >  >> Linux

指定された共有ライブラリがデバッグ シンボルでビルドされているかどうかを知る方法は?

not stripped に注意してください デバッグ シンボルを意味するものではありません。

ライブラリ コード:

//myshared.c
#include <stdio.h>

void print_from_lib()
{
    printf("Printed from shared library\n");
}

デバッグ フラグあり/なしのコンパイル:

gcc -c -Wall -Werror -fpic myshared.c
gcc -shared -o libmyshared.so myshared.o
gcc -g -c -Wall -Werror -fpic myshared.c -o myshared-g.o
gcc -g -shared -o libmyshared-g.so myshared-g.o

file で確認中

$ file libmyshared.so
libmyshared.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1ad3b94d5c8a7392c2140a647254753221a152cd, not stripped
$ file libmyshared-g.so 
libmyshared-g.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0268eaf97e5a670d2f7e767a011be6f06a83090a, not stripped

どちらも剥奪されていないと主張しています。ただし、libmyshared-g.so のみ 記号を示します:

$ objdump --syms libmyshared.so | grep debug
$ objdump --syms libmyshared-g.so | grep debug
0000000000000000 l    d  .debug_aranges 0000000000000000              .debug_aranges
0000000000000000 l    d  .debug_info    0000000000000000              .debug_info
0000000000000000 l    d  .debug_abbrev  0000000000000000              .debug_abbrev
0000000000000000 l    d  .debug_line    0000000000000000              .debug_line
0000000000000000 l    d  .debug_str 0000000000000000              .debug_str

file コマンドを使用して、ファイルが stripped かどうかを確認できます。 .基本的に、これはデバッグ シンボルがあるかどうかを意味します。

これが私のシステムからの 1 つのファイルです:

$ file libjsd.so
     libjsd.so: ELF 32-bit LSB shared object, \
     Intel 80386, version 1 (SYSV), dynamically linked, 
     stripped

剥ぎ取られたことに注目してください。

ここに私がまとめたものがあります:

$ file libprofile_rt.so
libprofile_rt.so: ELF 64-bit LSB shared object, x86-64, 
      version 1 (SYSV), dynamically linked, 
     BuildID[sha1]=0x..., not stripped

デバッグ シンボルがあることを示す「ストリップされていない」を参照してください。

objcopy を使用して、共有オブジェクト自体からデバッグ シンボルを分離することもできます。これにより、別のファイルにシンボルが抽出され、それらを元に戻すにはリンクを知る必要があります。 build-ids を使用して gdb でこれを行うための手順を確認できます。これは、シンボルなしで何かを配信したいが、ダンプからピンチでデバッグできる場合に役立ちます.


Linux
  1. 特定のパターンで最新のログ ファイルを末尾に -f する方法

  2. Linux 共有ライブラリがエクスポートしている関数のリストを表示するにはどうすればよいですか?

  3. Linux で共有ライブラリのバージョン管理を行う方法は?

  1. Electronを使用してLinuxデスクトップアプリを構築した方法

  2. 警告:静的ライブラリに対する共有ライブラリのリンクは移植可能ではありませんの意味は何ですか?

  3. set -e オプションが有効かどうかはどうすればわかりますか?

  1. Linux 共有ライブラリの紹介 (共有ライブラリの作成方法)

  2. bash スクリプトが .NET でソースされたときに、インストールされているディレクトリをどのように知ることができますか。オペレーター?

  3. 共有オブジェクトからエクスポートされたすべてのシンボルを確認するにはどうすればよいですか?