다음은 정말 좋은 참조입니다 : 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에 넣습니다.