내가 elf를 컴파일할 때 "모범 사례"는 내가 생각할 수 있는 가장 오래된 버전의 glibc에 연결하여 최신 버전과 이전 버전의 glibc 모두에서 실행되도록 하는 것입니다.
즉, realpath를 사용하면 readelf
glibc 출력에서 GLIBC_2.0 버전과 GLIBC_2.3 버전이 모두 있음을 알 수 있습니다. ELF가 glibc 2.0/1/2 작업에 있을 수 있도록 이전 버전을 사용하고 싶습니다.
하지만 GLIBC_2.3 버전은 출시 이후 개발 및 업그레이드 중이었을 수 있으며, GLIBC_2.0 버전은 glibc 2.3 출시 이후로 변경되지 않은 것 같습니다. 그래서 나는 내 엘프가 사용 가능한 경우 GLIBC_2.3 버전을 사용하고 사용할 수 없는 경우 GLIBC_2.0 버전으로 돌아가기를 원한다고 생각합니다.
가능합니까? 아니면 뭔가 이해가 안 되나요?
답변1
그런 관행을 부르는 것은커녕 들어본 적도 없습니다.최고관행. 제가 생각할 수 있는 가장 가까운 것은 ELF 악성 코드를 보면 실제로 오래된 버전의 Linux 커널과 이전 버전의 libc에 대해 컴파일되는 경우가 많다는 것입니다. 그러나 이것이 "모범 사례"로 간주되는지는 확실하지 않습니다.
Linux가 ELF 실행 파일을 메모리에 저장하는 방식을 고려하면 명시적인 폴백이 가능하지 않다고 생각합니다. 커널이 하는 일은 ELF 파일의 다양한 부분을 파일의 PT_LOAD Pheader를 기반으로 메모리에 매핑하는 것뿐입니다. Linux는 또한 일반적으로 /lib/ld-linux.so.2
또는 /lib64/ld-linux-x86-64.so.2
. 인터프리터는 libc의 일부이며 libc.so
다른 공유 객체에 대한 동적 연결을 담당합니다.
ELF 파일은 사용 가능한 공유 객체와 연결되어 있으므로 명시적인 버전 선택이 불가능하다고 썼습니다. 그것은 모두 ELF 인터프리터에 달려 있습니다.