ELF 실행 파일의 어느 부분이 메모리에로드됩니까?


10

내가 이미 알고있는 것 :

ELF 실행 파일에는 여러 섹션이 있습니다. 분명히 .text 및 .data 섹션은 프로그램의 주요 부분이므로 메모리에로드됩니다. 그러나 프로그램이 작동하려면 특히 동적으로 링크 된 경우 더 많은 정보가 필요합니다.

내가 관심있는 것은 .plt, .got, .dynamic, .dynsym, .dynstr 등의 섹션입니다. 기능을 주소에 연결하는 기능을 담당하는 ELF의 부분.

내가 지금까지 알아낼 수 있었던 것은 .symtab 및 .strtab과 같은 것들이 메모리에로드되지 않거나 유지되지 않는다는 것입니다. 그러나 링커에서 .dynsym 및 .dynstr을 사용합니까? 그들은 기억에 남아 있습니까? 프로그램 코드에서 액세스 할 수 있습니까?

그리고 커널 메모리에 상주하는 실행 파일의 부분이 있습니까?

이것에 대한 나의 관심은 대부분 법의학이지만,이 주제에 관한 정보가 도움이 될 것입니다. 이 테이블과 동적 연결에 대해 읽은 리소스는 더 높은 수준이며 메모리의 내용에 대해서는 실용적인 것이 아니라 작업 내용 만 설명합니다.

내 질문에 대해 분명하지 않은 점이 있으면 알려주세요.

답변:


12

다음은 정말 좋은 참조입니다 : http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . 여기에는 다양한 수준의 다양한 참고 문헌 끝에 참고 문헌이 포함되어 있습니다. 모든 세부 사항을 알고 싶다면 http://www.akkadia.org/drepper/dsohowto.pdf 로 바로 이동 하십시오 . (Ulrich Drepper는 Linux 동적 링커를 작성했습니다.)

"objdump -h myexe"또는 "readelf -S myexe"와 같은 명령을 실행하여 실행 파일의 모든 섹션에 대한 훌륭한 개요를 얻을 수 있습니다.

.interp 섹션에는이 객체의 심볼을 동적으로 연결하는 데 사용되는 동적 로더의 이름이 포함되어 있습니다. .dynamic 섹션은 동적 로더가 읽기 쉽도록 형식화 된 프로그램 헤더의 증류입니다. (따라서 다른 모든 섹션에 대한 포인터가 있습니다.)

.got (Global Offset Table) 및 .plt (Procedure Linkage Table)는 동적 링커에서 조작하는 두 가지 주요 구조입니다. .got은 변수에 대한 간접 테이블이고 .plt는 함수에 대한 간접 테이블입니다. 각 실행 파일 또는 라이브러리 ( "공유 객체"라고 함)에는 고유 한 .got 및 .plt가 있으며 이들은 실제로 다른 공유 객체에 포함되어있는 해당 공유 객체가 참조하는 기호 표입니다.

.dynsyn에는 공유 객체의 심볼에 대한 모든 정보가 있습니다 (정의한 심볼과 참조해야하는 외부 심볼 모두). .dynsyn에는 실제 심볼 이름이 포함되어 있지 않습니다. 그것들은 .dynstr에 포함되어 있으며 .dynsyn은 .dynstr에 대한 포인터를 가지고 있습니다. .gnu.hash는 이름별로 기호를 빠르게 조회하는 데 사용되는 해시 테이블입니다. 또한 포인터 (.dynstr에 대한 포인터 및 버킷 체인을 만드는 데 사용되는 포인터) 만 포함합니다.

공유 객체가 일부 심볼 "foo"를 역 참조 할 때, 동적 링커는 링크 된 모든 동적 객체에서 "foo"를 찾아서 찾고자하는 "foo"를 포함하고있는 것이 무엇인지 파악해야합니다. "foo"의 주소는 해당 공유 객체 안에 있습니다.) 동적 링커는 연결된 모든 공유 객체의 .gnu.hash 섹션 또는 .gnu가없는 이전 공유 객체의 .hash 섹션을 검색하여이를 수행합니다. 해시 섹션.) 연결된 공유 객체에서 올바른 주소를 찾으면 공유 객체의 .got 또는 .plt에 넣습니다.


감사합니다. 귀하의 링크는 필요한 섹션의 가상 매핑을 찾는 데 한 단계 더 나아갑니다. 이것에 대한 나의 관심은 법의학이므로 "DRAM에로드"는 여전히 나와 관련이 있습니다. 섹션이 매핑되었지만로드되지 않은 경우 메모리 덤프에서 찾을 수 없습니다. :)
Dutchy

네 말이 맞아 메모리 덤프를 수행 할 때 매핑 된 모든 페이지의 사본을 얻을 수 있으므로 "vm에 매핑 됨"과 "DRAM에로드 됨"의 구분이 중요하지 않습니다. 나는 그 문장을 제거하고 답변이 향상되었습니다. 감사합니다!
방황 논리

내가 얻는 것만 큼 많은 정보가 있기 때문에 귀하의 답변을 답변으로 표시했습니다. :) 나머지는 스스로해야합니다. 결국 내 연구입니다.
Dutchy

따라서 yes .dynsym 및 .dynstr (및 기타)은 동적 링커에서 사용되며 프로그램 메모리 (텍스트 세그먼트)에로드되며 프로그램에서 런타임에 사용할 수 있습니다.
ysdx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.