
어떤 이유로 나는 내 자신의 rtld 버전(ld-elf.so.1)을 수정하고 테스트하려고 합니다. 이 링커를 변경할 때마다 시스템을 재부팅하고 CD/DVD에서 가져와서 /libexec/에 내 버전을 설치한 다음 시스템을 다시 재부팅해야 합니다. 때로는 분할 오류로 인해 사용자 공간을 실행하지 않는 경우도 있습니다. 나는 그런 과정에서 많은 시간을 낭비하고 있다.
/libexec에 rtld를 다시 설치하고 시스템을 재부팅하지 않고 명령줄에서 이 링커를 시작할 수 있는 방법을 묻고 싶습니다. Linux /lib/ld-linux.so.2와 유사하게 rtld를 실행할 수 있습니까?
ld-elf.so.1을 실행하려고 시도했지만 분할 오류가 발생할 때마다. 아마도 rtld 명령줄에서 일부 매개변수를 놓친 것 같습니다. 명령줄에서 rtld를 실행하는 방법에 대한 제안이 있으십니까?
실행 파일의 기본 인터프리터를 변경할 수 있을까요?
편집: 내 rootfs의 파일 시스템으로 UFS를 사용합니다.
답변1
Linux와 유사하게 rtld를 실행할 수 있습니까
/lib/ld-linux.so.2
?
예, /libexec/ld-elf.so.1 /path/to/your_binary
Linux에서와 마찬가지로 FreeBSD에서도 실행이 잘 작동합니다.
실행 파일의 기본 인터프리터를 변경할 수 있을까요?
예, 바이너리를 컴파일할 때 cc -Wl,-dynamic-linker=/path/to/your_interpreter
. 이는 gcc/clang이 인수를 링커에 직접 전달하는 방식입니다. 해당 플래그 와 기타 플래그 에 대한 설명은 맨페이지를 -Wl,..
참조하세요 .ld(1)
--dynamic-linker
실행하려고 시도했지만
ld-elf.so.1
분할 오류가 발생할 때마다.
동적 링커/인터프리터는 위치 독립적( -pie
)으로 컴파일되어야 하며 자체적으로 공유 객체에 의존하거나 다른 인터프리터를 사용할 수 없습니다.
답변2
내 rootfs에는 UFS를 사용합니다.
ZFS 답변은 매우 간단하기 때문에 안타깝습니다. 아마도 당신은 그것을 전환 이유라고 생각할 것입니다.
운영 체제의 정적 부분이 모두 하나의 데이터 세트에 있는 한 ZFS를 만듭니다.클론데이터 세트의 일부 하위 디렉터리에 마운트하고 거기에서 로더(또는 수정하려는 모든 항목)를 수정한 다음 해당 하위 디렉터리를 루트로 사용하여 감옥을 만듭니다. 이는 운영 체제의 쓰기 중 복사 복사본을 제공하지만 수정된 로더를 사용합니다.현장에서메인 로더로 설치된 경우와 같습니다(그것은감옥에 관한 한).
(TrueOS는 루트에 대한 큰 데이터 세트를 보유하고 , 및 와 같은 /usr
별도의 데이터 세트에 대한 지점을 효과적으로 잘라내는 방법을 보여주었습니다 .)/var/*
/tmp
/usr/{obj,src,ports,jails,home}
이 접근 방식을 사용하면 jail
매뉴얼 페이지와 14장 에 설명된 긴 프로세스가 필요하지 않습니다.FreeBSD 핸드북, 감옥의 루트 디렉터리 내에 운영 체제의 전체 복사본을 구축하는 것과 관련된 감옥 디렉터리 트리를 설정합니다. ZFS 복제본은 실제 루트 데이터 세트를 원본으로 사용하는 빠른 쓰기 중 복사입니다.