ELF 실행 파일의 어느 부분이 메모리에 로드되며, 어디에 있습니까?

ELF 실행 파일의 어느 부분이 메모리에 로드되며, 어디에 있습니까?

내가 이미 알고 있는 것:

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

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

지금까지 내가 배운 것은 .symtab 및 .strtab 같은 것이 메모리에 로드되지 않거나 유지되지 않는다는 것입니다. 하지만 링커는 .dynsym과 .dynstr을 사용합니까? 아직도 기억 속에 있나요? 프로그램 코드에서 액세스할 수 있나요?

실행 파일의 일부가 커널 메모리에 있습니까?

이에 대한 나의 관심은 주로 법의학이지만 이 주제에 대한 정보가 있으면 도움이 될 것입니다. 이러한 테이블과 동적 링크에 대해 내가 읽은 리소스는 더 고급이며 메모리에 있는 내용에 대한 실제적인 내용보다는 작동 방식만 설명합니다.

제 질문에 불분명한 점이 있으면 알려주시기 바랍니다.

답변1

다음은 매우 좋은 참고 자료입니다.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(전역 오프셋 테이블) 및 .plt(프로시저 연결 테이블)는 동적 링커가 작동하는 두 가지 주요 구조입니다. .got은 변수에 대한 간접 테이블이고, .plt는 함수에 대한 간접 테이블입니다. 각 실행 파일 또는 라이브러리("공유 개체"라고 함)에는 해당 공유 개체가 참조하는 기호 테이블인 고유한 .got 및 .plt가 있으며 이러한 기호는 실제로 다른 공유 개체에 포함되어 있습니다.

.dynsyn에는 공유 객체의 기호(사용자가 정의한 기호 및 참조해야 하는 외부 기호 포함)에 대한 모든 정보가 포함되어 있습니다. .dynsyn에는 실제 기호 이름이 포함되어 있지 않습니다. 이는 .dynstr에 포함되어 있으며 .dynsyn에는 .dynstr에 대한 포인터가 있습니다. .gnu.hash는 이름으로 기호를 빠르게 검색하기 위한 해시 테이블입니다. 또한 포인터(.dynstr에 대한 포인터 및 버킷 체인을 생성하는 데 사용되는 포인터)만 포함됩니다.

공유 객체가 일부 기호 "foo"를 역참조할 때 동적 링커는 찾고 있는 "foo"가 포함된 개체(그러면 상대적인)를 찾기 위해 링크된 모든 동적 개체에서 "foo"를 찾아야 합니다. "foo"의 주소는 공유 객체 내부에 있습니다. ) 동적 링커는 연결된 모든 공유 객체의 .gnu.hash 부분(또는 .gnu가 없는 이전 공유 객체의 .hash 부분)을 검색하여 이를 수행합니다. 연결된 공유 개체에서 올바른 주소를 찾으면 이를 공유 개체의 .got 또는 .plt에 배치합니다.

답변2

파일을 실행하면 아래에 유형으로 나열된 다양한 세그먼트가 readelf -e표시됩니다 . 이는 메모리에 로드되는 ELF 파일의 일부입니다.LOADProgram Headers

각 부품(예: .text, .got.plt, .dynsym)은 세그먼트 내에 위치합니다. 출력은 각 섹션을 해당 세그먼트와 일치시키는 섹션 readelf -e으로 구성됩니다 . Section to Segment mapping이 정보를 사용하면 어떤 섹션이 로드되는지 확인할 수 있습니다.

관련 정보