어떤 이유에서인지 내 자신의 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
. 이것이 -Wl,..
gcc/clang이 인수를 링커에 직접 전달하는 방법입니다. ld(1)
이 플래그와 다른 플래그에 대한 설명은 맨페이지에서 확인할 수 있습니다.--dynamic-linker
달리려고 하는데
ld-elf.so.1
매번 분할 오류가 발생합니다.
동적 링커/인터프리터는 위치 독립적( )으로 컴파일되어야 하며 -pie
자체적으로 공유 객체에 의존하거나 다른 인터프리터를 사용해서는 안 됩니다.
답변2
내 rootfs에는 UFS를 사용합니다.
ZFS에 대한 대답은 매우 간단하기 때문에 안타까운 일입니다. 어쩌면 이것이 전환 이유라고 볼 수도 있습니다.
OS의 정적 부분이 모두 하나의 데이터 세트에 있는 한 ZFS를 만들 수 있습니다.클론데이터 세트를 일부 하위 디렉터리에 마운트하고 거기에서 로더(또는 수정하려는 항목)를 수정한 다음 해당 하위 디렉터리를 루트로 사용하여 감옥을 만듭니다. 이는 운영 체제의 쓰기 중 복사 복사본을 제공하지만 수정된 로더를 사용합니다.현장에서메인 로더로 설치하는 것과 같습니다(이것은감옥에 관한 한).
(TrueOS는 루트에 대한 대규모 데이터 세트를 제공하고 , 및 /usr
와 같은 별도의 데이터 세트에 대한 /var/*
지점을 효과적으로 잘라내는 방식으로 이 접근 방식을 보여줍니다 /tmp
. /usr/{obj,src,ports,jails,home}
)
이 접근 방식은 jail
매뉴얼 페이지와 매뉴얼의 14장에 설명된 긴 프로세스를 제거합니다.FreeBSD 매뉴얼감옥 디렉토리 트리를 설정하는 데 사용되는 는 감옥의 루트 디렉토리에 운영 체제의 전체 복사본을 구축하는 것과 관련됩니다. ZFS 클론은 실제 루트 데이터 세트를 소스로 사용하는 빠른 쓰기 중 복사입니다.