동적 라이브러리의 코드는 자신이 호출되는 프로세스 내에서 어떻게 알 수 있나요?

동적 라이브러리의 코드는 자신이 호출되는 프로세스 내에서 어떻게 알 수 있나요?

올바르게 이해했다면 하나의 dylib 인스턴스는 로드될 때 하나의 메모리 세그먼트에 저장되고 공유됩니다.그리고 복사 안됨여러 프로세스 사이에 필요한 가상 메모리입니다. 하지만 실행 시간에 누가 전화하는지 어떻게 알 수 있나요?

예를 들어 내 프로세스 이름에 의존하는 일부 라이브러리의 클래스 생성자에게(실제로 이름을 직접 전달할 수 있으므로 이름을 직접 전달하지 않고), 연결된 여러 프로세스가 정확히 무엇을 호출했는지 어떻게 알 수 있습니까?

(이 예에서 메타 정보는 비밀이 아니며 간단한 시스템 호출로 검색할 수 있다는 사실 생략) / 라이브러리의 코드는 동일한 메모리 공유와 마찬가지로 이론적으로 가능한 모든 프로세스 메모리의 정보에 의존할 수도 없습니다. 체계는 확실히 거꾸로 적용될 수 없습니다(하나의 라이브러리 <-동시에 많은 프로세스). 이는 큰 보안 허점이 될 것입니다.

라이브러리가 일부 프로세스 관련 정보를 클래스에 정적 속성으로 저장하고 일부 특정 프로세스 내에서 공유해야 하지만 모든 프로세스가 아닌 경우 상황은 더욱 복잡해집니다.붙어 있다는 것입니다. 실제로 데이터는 클래스가 자신의 일반 필드로 볼 수 있는 형식으로 프로세스 메모리에 기록될 것이라고 가정합니다. 하지만 다시 라이브러리 코드 수준에서 프로세스 인식 문제로 돌아갔습니다.

답변1

일반적으로 스택(반환 주소의 출처), 힙(데이터 저장소) 및 일부 변수 값 또는 주소에 대한 포인터가 CPU 레지스터에 전달됩니다. 이러한 주소는 모두 호출자의 가상 메모리에 있습니다. 동적 라이브러리 코드는 호출자의 컨텍스트에서 실행되므로 모든 syscall은 호출자가 수행한 것처럼 동작합니다.

나는 내 가상 공간에 있는 내 물건에 대한 포인터를 사용하여 공유 라이브러리를 호출하고 사용자는 가상 공간에서 포인터를 사용하여 자신의 물건을 가리키는 공유 라이브러리를 호출합니다.

관련 정보