GDBの「セクション」コマンドが期待どおりに機能しないようです。

GDBの「セクション」コマンドが期待どおりに機能しないようです。

私が理解したところ、このsectionコマンドを使用して、gdbファイルの特定の部分が特定のアドレスにロードされたことをターゲットファイルに通知できます。私の理解によれば、そのセクションのすべてのシンボルを新しいアドレスに再配置する必要があります。それ以外のポイントは何ですか?

しかしそうではないようです。ダミープログラムでお見せしますa.c

void func(void)
{
}

int main()
{
}

gcc -g a.c thenを使用したコンパイルgdb ./a.out

(gdb) pipe info files | grep .text
    0x0000000000001040 - 0x0000000000001143 is .text

(gdb) mt info sections .text
Exec file: `/******/a.out', file type elf64-x86-64.
 [13]     0x00001040->0x00001143 at 0x00001040: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

(gdb) info address func
Symbol "func" is a function at address 0x1129.

(gdb) info symbol 0x1129
func in section .text

(gdb) section .text 0x100000
------
    0x0000000000100000 - 0x0000000000100103 is .text
------

# However:
(gdb) mt info sections .text
Exec file: `/*******/a.out', file type elf64-x86-64.
 [13]     0x00001040->0x00001143 at 0x00001040: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

# Calculate relocated address 
(gdb) p/x 0x1129-0x1040+0x100000
$1 = 0x1000e9

(gdb) info symbol 0x1000e9
No symbol matches 0x1000e9.

(gdb) info address func
Symbol "func" is a function at address 0x1129.

ここで何が起こっているのでしょうか?出力がmt info sectionsと異なる理由は何ですかinfo files?なぜfunc古い住所を維持するのですか?私のsectionコマンドは実際に何をしますか?

しかし、これを使用すると、追加のadd-symbol-file ./a.out -s .text 0x100000シンボルファイルについて私が期待しているものとまったく一致しますsection

gdb関連性がある場合は、Ubuntu 22.04システムでバージョン12.1を使用しています。

どんな助けでもいただければ幸いです:)

ベストアンサー1

おすすめ記事