PLT(proceduere linkage table)와 동적링커 사이의 관계가.
글쓴이: zellgam / 작성시간: 월, 2013/12/30 - 1:59오후
현재 유닉스 리눅스 프로그래밍 - 필수유틸리티 책을 공부하고 있습니다.
오브젝트 파일에서 공유 라이브러리를 사용할때 (예를 들어 puts)
puts가 사용된 곳에 PLT섹션을 호출하도록 링킹한다고 하는데....
그리고 컴파일 된 프로그램을 실행할때 puts라는 라이브러리가 필요하다고 하면 동적링커에 제어권을 넘긴다고 하고
동적링커는 필요한 공유 라이브러리를 메모리에 매핑한다고 하는데요....
그럼 PLT와 동적 링커는 어떠한 관계가 있는거죠...??
고수님들 부탁드리겠습니다.
Forums:
내가 고수다..^^
필수유틸리티 p74 14번째줄을 참고하시면 됩니다...
PLT 에 대하여..
탐에게 물어보십시오.
안녕하세요 ㅎㅎ
Dump of assembler code for function main:
0x0804840c <+0>: push %ebp
0x0804840d <+1>: mov %esp,%ebp
0x0804840f <+3>: and $0xfffffff0,%esp
0x08048412 <+6>: sub $0x10,%esp
0x08048415 <+9>: movl $0x80484c8,(%esp)
=> 0x0804841c <+16>: call 0x80482f0
0x08048421 <+21>: mov $0x0,%eax
0x08048426 <+26>: leave
0x08048427 <+27>: ret
End of assembler dump.
Dump of assembler code for function puts@plt:
=> 0x080482f0 <+0>: jmp *0x804a00c
0x080482f6 <+6>: push $0x0
0x080482fb <+11>: jmp 0x80482e0
End of assembler dump.
Dump of assembler code for function puts@plt:
0x080482f0 <+0>: jmp *0x804a00c
=> 0x080482f6 <+6>: push $0x0
0x080482fb <+11>: jmp 0x80482e0
End of assembler dump.
Dump of assembler code for function puts@plt:
0x080482f0 <+0>: jmp *0x804a00c
0x080482f6 <+6>: push $0x0
=> 0x080482fb <+11>: jmp 0x80482e0
End of assembler dump.
No function contains program counter for selected frame.
eip 0x80482e0 0x80482e0
eip 0x80482e6 0x80482e6
0xb7ff26a0 in ?? () from /lib/ld-linux.so.2
예전에 디버깅해본 정보입니다....
puts함수를 호출하면은 바로 그 함수로 가는것이 아니라 plt Section으로 갑니다 plt Section에는 함수에 대한 맨처음에는 아무것도 지니지 않은 값들이 존재합니다.
그다음으로 plt Section에서는 다이나믹 링커 ld-linux.so.2로 점프합니다. 여기서부터는 심볼정보가 없어서 못올렸으나 이떄 돌아오는 값은 puts 함수의 주소값입니다. 그 값을 plt Section에 저장해놓고 다음부터는 다이나믹 링커를 거치지 않고 바로 함수를 호출할수 있게 하여줍니다…
그렇다면은 다이나믹링커는 해당 함수들의 엔트리포인트? 를 가지고 있다가? 로딩이 않되어 있다면은 로딩도 시켜주고, 요청이 들어오는 놈에게 해당정보를 알려주는 것입니다. 이렇게 해서 생기는 이득으로는 정적로딩에 따른 오버해드의 감소 및 메모리 공간을 효율적으로 사용할수 있지않을까요?? 둘이 똑같은 말이지만요 …
plt Section에 대해 아는내용은 이게전부입니다....
got Section은 글로벌심볼들의 정보를 가지고 Relocation 하여줍니다..
댓글 달기