여기서 @plt는 무엇을 의미합니까?
0x00000000004004b6 <main+30>: callq 0x400398 <printf@plt>
아는 사람 있나요?
최신 정보
왜 두 가지는 disas printf
나에게 다른 결과를 제공합니까?
(gdb) disas printf
Dump of assembler code for function printf@plt:
0x0000000000400398 <printf@plt+0>: jmpq *0x2004c2(%rip) # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
0x000000000040039e <printf@plt+6>: pushq $0x0
0x00000000004003a3 <printf@plt+11>: jmpq 0x400388
(gdb) disas printf
Dump of assembler code for function printf:
0x00000037aa44d360 <printf+0>: sub $0xd8,%rsp
0x00000037aa44d367 <printf+7>: mov %rdx,0x30(%rsp)
0x00000037aa44d36c <printf+12>: movzbl %al,%edx
0x00000037aa44d36f <printf+15>: mov %rsi,0x28(%rsp)
0x00000037aa44d374 <printf+20>: lea 0x0(,%rdx,4),%rax
0x00000037aa44d37c <printf+28>: lea 0x3f(%rip),%rdx # 0x37aa44d3c2 <printf+98>
각 프로세스에 대해 별도의 코드 사본을 유지하지 않고도 코드 수정 (코드가 가상 메모리에있는 위치를 기준으로 주소 조정, 프로세스에 따라 다를 수 있음)을 얻는 방법입니다. PLT는 동적 로딩 및 링크를 사용하기 쉽게 만드는 구조 중 하나 인 프로 시저 연결 테이블입니다.
printf@plt
실제로는 (결국) 실제 printf
함수를 호출하는 작은 스텁으로 , 후속 호출을 더 빠르게 만들기 위해 작업을 수정합니다.
실제 printf
기능에 매핑 될 수 있는 호출하려고하는 코드가 수도로 주어진 프로세스 (가상 주소 공간)에 위치.
따라서 호출 코드 (왼쪽 아래)와 호출 된 코드 (아래 오른쪽)의 적절한 코드 공유를 허용하려면 호출 코드에 직접 수정을 적용하지 않는 것이 좋습니다. 이렇게하면 위치를 제한 할 수 있습니다. 다른 프로세스.
따라서 이는 프로세스 간에 공유 되지 않는 안정적으로 계산 된 런타임 주소에 PLT
있는 더 작은 프로세스 별 영역 이므로 주어진 프로세스는 악영향없이 원하는대로 자유롭게 변경할 수 있습니다.
어떤 프로그램 코드와 두 개의 서로 다른 프로세스에서 다른 가상 주소에 매핑 라이브러리 코드, 모두 다음 다이어그램 검사 ProcA
및 ProcB
:
Address: 0x1234 0x9000 0x8888
+-------------+ +---------+ +---------+
| | | Private | | |
ProcA | | | PLT/GOT | | |
| Shared | +---------+ | Shared |
========| application |=============| library |==
| code | +---------+ | code |
| | | Private | | |
ProcB | | | PLT/GOT | | |
+-------------+ +---------+ +---------+
Address: 0x2020 0x9000 0x6666
이 특정 예는 PLT가 고정 된 위치에 매핑되는 간단한 경우를 보여줍니다. 에서 당신의 프로그램 카운터 상대 조회에 의해 입증 시나리오, 그것은 현재의 프로그램 카운터를 기준으로 위치하고 :
<printf@plt+0>: jmpq *0x2004c2(%rip) ; 0x600860 <_GOT_+24>
예제를 더 간단하게 유지하기 위해 고정 주소 지정을 사용했습니다.
원래의 코드를 공유하고있는 방법은 그들이로드 할 수있는 한 그것을 의미 같은 를 사용하는 모든 프로세스의 각 가상 주소 공간의 메모리 위치. 하나의 프로세스에 대해 단일 공유 복사본을 수정하는 작업은 다른 위치에 매핑 된 다른 프로세스를 완전히 채우 므로 공유 할 수 없습니다 .
PLT 및 GOT (전역 오프셋 테이블)와 함께 위치 독립적 코드를 사용 하면 함수 (PLT에서 )에 대한 첫 번째 호출 printf@plt
은 다음 작업이 수행되는 다단계 작업입니다.
printf@plt
PLT를 호출 합니다.- 처음에는 PLT의 일부 설정 코드를 가리키는 GOT 버전 (포인터를 통해)을 호출합니다 .
- 이 설정 코드는 아직 완료되지 않은 경우 관련 공유 라이브러리를로드 한 다음 후속 호출 이 PLT 설정 코드가 아닌 실제를 직접 호출하도록 GOT 포인터 를 수정 합니다
printf
. - 그런 다음
printf
이 프로세스에 대한 올바른 주소에서 로드 된 코드 를 호출합니다 .
후속 호출에서 GOT 포인터가 수정 되었기 때문에 다단계 접근 방식이 단순화됩니다.
printf@plt
PLT를 호출 합니다.- It calls the GOT version (via pointer), which now points to the real
printf
.
A good article can be found here, detailing how glibc
is loaded at run time.
Not sure, but probably what you have seen makes sense. The first time you run the disas command the printf is not yet called so it's not resolved. Once your program calls the printf method the first time the GOT is updated and now the printf is resolved and the GOT points to the real function. Thus, the next call to the disas command shows the real printf assembly.
참고URL : https://stackoverflow.com/questions/5469274/what-does-plt-mean-here
'IT TIP' 카테고리의 다른 글
전면 광고 AdMob 광고 : 'IllegalStateException : 전체 화면 활동 만 방향을 요청할 수 있습니다.' (0) | 2020.11.01 |
---|---|
TFS 명령 shelve / unshelve에 해당하는 Git은 무엇입니까? (0) | 2020.11.01 |
간접 확장이란 무엇입니까? (0) | 2020.11.01 |
Bash case 문에서 빈 문자열을 어떻게 테스트합니까? (0) | 2020.11.01 |
Android Studio에서 '출시'APK를 빌드하는 방법은 무엇입니까? (0) | 2020.11.01 |