2

ストリップされたバイナリから Linux でブレークパッド シンボルを生成するのに苦労しています。

私はコンパイルします:

gcc-4.4 -c -I../include -D_LINUX -m64 -fPIC -D__LP64__ -D_GNU_SOURCE -Wno-switch -Wno-missing-braces -fno-strict-aliasing -Wreturn-type -Wall -Wno-unknown-pragmas -Wno-parentheses -pipe -fmessage-length=0 -g -DRELEASE -O3 -o lin/voxl.o voxl.c -fvisibility=hidden

いくつかの C++ ファイルもあります。

私は次にリンクします:

g++-4.4 -o ../liblin/foo.so -shared  <objects> <libs> -z origin -Wl,-R,\$ORIGIN -Wl,-rpath,../liblin

最後に、デバッグ情報を次のように .debug ファイルに取り除きます。

objcopy --only-keep-debug ../liblin/foo.so ../liblin/foo.so.debug
objcopy --strip-debug ../liblin/foo.so
objcopy --add-gnu-debuglink=../liblin/foo.so.debug ../liblin/foo.so

結果のバイナリは、完全なシンボル情報を使用して GDB でデバッグできます。(ディレクトリパスなし).gnu_debuglinkを参照するセクションが含まれていますが、これは正しいです。foo.so.debug

ただし、このパッチで編集されているコードは、リンクをたどる必要があることを強く示唆していますが、dump_syms はリンクをたどっていないようです。この出力を stderr に取得します。

liblin/foo.so, section '.eh_frame': the call frame entry at offset 0x18 uses a DWARF expression to describe how to recover register '.cfa',  but this translator cannot yet translate DWARF expressions to Breakpad postfix expressions
liblin/foo.so: file contains no debugging information (no ".stab" or ".debug_info" sections)

.gnu_debuglink結果のシンボル ファイルは、セクションが ELF に存在するかどうかに関係なく、2MBです。この 2MB のシンボル ファイルを minidump_stackwalk で使用すると、スタック フレームに間違った関数が表示されます。シンボルが埋め込まれたバイナリで実行するdump_symsと、出力ファイルは 9MB になり、スタック フレームは正しくなります。

私は何を間違っていますか?

4

1 に答える 1

4

これにより、次の 2 つのことが判明しました。

  1. dump_symsシンボルがバイナリと同じフォルダにある場合でも、外部ファイルからシンボルをロードするには、 へのディレクトリ パスを指定する必要があります。例えばdump_syms foo.so .
  2. Breakpad には、外部シンボルが見つかっても読み込まれないというバグがあります。それを修正するパッチを提出しました。
于 2015-01-14T13:43:20.610 に答える