2010-12-16 2 views
0

일반적으로 프로그램은 여러 라이브러리에 따라 달라지며 때로는 다른 프로그램에도 종속 될 수 있습니다. 저는 Wine과 같은 프로젝트를보고 프로그램이 무엇을 만들고 있는지를 어떻게 생각합니까?런타임에서 프로그램 호출 호출 및 다른 호출에 매핑

리눅스 환경에서 실행 파일이 실행 중에 어떤 호출이 다른 호출을 잡아서 매핑하는지 알기 위해 사용 된 접근법은 무엇입니까? 추가 읽기 자료에

모든 코드 조각 또는 참조 대단히 감사합니다 :)

+0

소스 코드 파일에서 호출을 정적으로 문서화하거나 런타임에 무언가를 수행하는 방법을 의미합니까, 둘 다 languaje-agnostic이 아니지만 특별히 두 번째는 사용 된 기술에 크게 의존합니다. –

+0

그 점을 지적 해 주셔서 고마워요, 저는 실제로 런타임에 의미합니다. 내가 관심을 갖고있는 것은 접근 방식이다. 언어 불가지론 자 태그는 단지 거기에 있었기 때문에 누군가가 어떤 요점을 명확히하고 싶다면 어떤 언어로든 코드 샘플을 넣을 수있다. 그냥 질문과 게시물을 편집했습니다. – Saif

+0

linux에서 strace 명령을 확인하십시오. 실행 가능/명령이 수행하는 모든 호출을 나열합니다. 희망이 당신이 알고 싶었던 것입니다. – Arunmu

답변

1

리눅스에 당신이 LD_PRELOAD 환경 변수를 찾고 있습니다. 이렇게하면 프로그램에서 요청하기 전에 라이브러리가로드됩니다. 대상 프로그램에 의해로드 된 함수 정의와 일치하는 함수 정의를 제공하면 대신 버전이 호출됩니다.

프로그램이 어떤 기능을 호출하는지 실제로 알 수는 없습니다. 그러나 공유 라이브러리에서 모든 기능을 가져 와서 모든 기능을 구현할 수 있습니다. 당신은 실제로 기능을 잡기 위해서을 잡기 만하면됩니다. 단순히 다시 구현하는 것입니다.

Wine과 같은 프로젝트는 일부 경우에는이를 수행하지만 전부는 아닙니다. 또한 동적 라이브러리 중 일부를 다시 작성합니다. 따라서 Win32가 DLL을로드하면 실제로 네이티브 버전이 아닌 Wine 버전이로드됩니다. 이것은 본질적으로 기능을 자신의 것으로 대체하는 것과 동일한 개념입니다.

자세한 내용은 LD_PRELOAD를 참조하십시오.