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관련성이 있는 경우 우분투 22.04 시스템에서 버전 12.1을 사용하고 있습니다 .

어떤 도움이라도 주시면 감사하겠습니다 :)

관련 정보