
내가 이해한 바로는 이 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
관련성이 있는 경우 우분투 22.04 시스템에서 버전 12.1을 사용하고 있습니다 .
어떤 도움이라도 주시면 감사하겠습니다 :)