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 でこれを行うための手順を確認できます。これは、シンボルなしで何かを配信したいが、ダンプからピンチでデバッグできる場合に役立ちます.