프로그램이 메모리에 로드되고 실행되는 방법을 이해하기 위한 실습

StackOverflow https://stackoverflow.com/questions/1210522

  •  06-07-2019
  •  | 
  •  

문제

실행 파일을 메모리에 로드하거나 공유 라이브러리의 동적 로드와 같이 main()이 호출되기 전에 발생한 일이 궁금합니다.실습을 통해 이러한 사항을 이해하는 방법에 대한 제안이 있습니까?

내가 알고 있고 현재 사용하고 있는 도구에는 다음이 포함됩니다.

  • 스트레이스
  • 분해하다
  • 읽기
  • /proc/pid/맵

노트:나는 훌륭한 책을 알고 있다 링커와 로더, 그러나 책을 읽는 것보다 실습을 통해 배우는 것이 더 나을 수도 있습니다.

도움이 되었습니까?

해결책

  • LD.SO 남자 페이지 문서적으로 동적 링크 프로세스를 조정하거나 추가 세부 사항을 제공하도록 설정 될 수있는 여러 환경 변수.

예를 들어

LD_DEBUG=all cat </dev/null
  • Linux 커널, 동적 링커, C 라이브러리, 시작 코드 (CRT0.O 또는 이와 유사한)와 관련된 각 조각에 대한 소스 코드를 쉽게 얻을 수 있습니다. 코드를 연구하고 실험 수정으로 시작할 수 있습니다.

다른 팁

바이너리가 어떻게 포장되어 있는지 확인하고 다른 섹션을 확인하려면 최고의 프로그램이 있다고 생각합니다. objdump.

실행 파일을 선택하고 수행하십시오.


objdump -S <executable>  > myfile.S

또 다른 좋은 운동은 다음과 같습니다.

  • 외부 라이브러리를 사용하는 프로그램을 만듭니다
  • 정적 링크를 사용하여 프로그램을 컴파일하십시오
  • 프로그램을 실행하십시오
  • 라이브러리 파일의 이름을 바꾸고 프로그램이 실행되는지 확인하십시오.
  • 공유 라이브러리를 사용하여 프로그램을 컴파일하십시오
  • 라이브러리의 이름을 바꾸고 프로그램이 실행되는지 확인하십시오

그것은 커튼 아래에서 무슨 일이 일어나고 있는지에 대한 당신의 질문에 답할 것입니다.

나는 두 개의 흥미로운 관련 링크(적어도 Linux의 경우)를 발견했으며 언급된 책(링커 및 로더)보다 약간 짧습니다.

대학에서 OS 수업을 들었을 때 우리는 나쵸. 운영 체제가 아닙니다 그 자체, 그러나 사용자 공간에서 실행되는 일종의 운영 체제 "시뮬레이션". C ++로 작성되었으며 Nachos가로드 및 실행할 수있는 실행 파일을 교차 컴파일 할 수 있습니다. 시스템 통화 인터페이스를 사용하여 재생할 수 있으며 일반 실험에서 코드를 사용하여 원하는만큼 실험 할 수 있습니다.

우리는 그것을 Solaris Lab에서 실행했고 개인 기계에서 Linux에서 실행하고 실행하는 데 어려움이 있었지만 일부 코드를 기꺼이 파헤 치려한다면 재미있는 장난감 일 수 있습니다.

나는 그것이 당신이 찾고있는 것에 대한 것이 많지만 자신의 어셈블러와 링커를 작성하는 것은 매우 교육적 일 것임을 알고 있습니다. 나는 대학에있을 때 그것을했고 그것을 좋아했습니다. 내가 원했던 기본적인 일에 효과가 있도록 기억하면서 120 시간의 작업이 필요했을 것입니다. 나는이 프로젝트가 다른 무엇보다 프로그래밍 경력이 저에게 적합하다고 확신하게 만들었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top