私が理解したところ、この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を使用しています。
どんな助けでもいただければ幸いです:)