ELF와 SELF 로딩
로더는 복호화된 PS5 SELF와 순수 ELF64 모듈을 매핑하고, 재배치를 적용하며, HLE 레지스트리를 기준으로 임포트를 해결합니다. 그 뒤 타이틀은 직접 시작하는 모듈에 대해 안정적인 핸들을 받습니다.
2026년 10월 10일까지의 저장소 노트
이미지
PlayStation 5 실행 파일은 보통 ELF64 이미지를 감싼 SELF 컨테이너입니다. PS5PCEM은 컨테이너와 순수 ELF를 모두 읽습니다. 리더는 임포트를 모으고, 예약된 게스트 주소 공간에 세그먼트를 매핑하고, 재배치를 적용합니다. TLS 이미지는 그것을 실행할 스레드에 등록됩니다.
도구로 타이틀을 시작하지 않고도 모듈을 검사하거나, 재배치된 의존성 그래프를 덤프하거나, 셰이더를 디스어셈블할 수 있습니다. game-run은 불러오고, HLE를 초기화하고, 게스트에 진입하는 경로입니다. 복호화된 eboot.bin이 설치본과 따로 있으면 --app0으로 읽기 전용 마운트가 콘텐츠 디렉터리를 가리키게 합니다.
타이틀이 나중에 시작하는 모듈
런타임은 게스트 코드가 실행되기 전에 도달 가능한 의존성 그래프와 PS5_PRELOAD에 지정된 것을 매핑합니다. 그 뒤 sceKernelLoadStartModule은 그 집합에 속한 모듈에 대해 안정적인 핸들을 반환합니다. 다시 불러와도 재배치된 두 번째 사본을 만들지 않습니다. sceKernelDlsym은 타이틀이 넘긴 이름을 해시하고 핸들이 고른 모듈에서만 찾으므로, 같은 콜백을 익스포트하는 플러그인 두 개가 서로 섞이지 않습니다.
경로 비교는 슬래시 방향과 대소문자를 무시합니다. 관찰된 어떤 타이틀은 Il2CppUserAssemblies.prx를 요청하면서 Il2cppUserAssemblies.prx를 배포합니다. 정확히 일치해야 한다면 타이틀이 설치한 파일을 거부하게 됩니다. 상대 경로를 순수 파일 이름보다 먼저 시도하므로, 파일 이름이 같은 두 모듈도 구분됩니다. 게시된 집합에 없던 모듈은 ENOENT를 반환합니다. 게스트 스레드가 이미 실행 중인 동안에는 매핑하지 않습니다.
Unity 플러그인
Unity 플러그인은 생성자를 미룬 채 매핑할 수 있습니다. 그러면 그래프 초기화 중에 생성자를 실행하는 대신, sceKernelLoadStartModule이 타이틀의 실제 인수 블록으로 한 번 시작합니다. 이 순서가 인수를 받는 플러그인과 너무 일찍 시작하는 플러그인의 차이입니다.
로더는 리테일 SELF를 복호화하지 않습니다. 입력은 사용자가 불러올 권리가 있는 복호화된 이미지입니다. 암호화된 패키지는 PKG 도구가 다룰 문제이며, 리테일 암호화는 그 도구의 범위에서도 벗어납니다.
구현된 것
- ELF64와 복호화된 SELF의 매핑, 재배치, 임포트, TLS.
- 미리 불러온 의존성 그래프와 안정적인 sceKernelLoadStartModule 핸들.
- 대소문자를 구분하지 않는 경로 비교와 선택한 모듈로 제한된 Dlsym.
- 실제 인수로 시작하도록 Unity 플러그인 생성자 지연.
아직 빠진 것
- 시작 뒤에야 나타나고 미리 불러오지 않은 모듈은 ENOENT를 반환합니다.
- 암호화된 리테일 SELF 이미지는 복호화하지 않습니다.
- Windows가 아닌 호스트의 검사용 빌드는 불러온 이미지를 실행하지 않습니다.
관련 메커니즘
이 페이지들에 대하여