리눅스 관련 경험이 많지 않아서 제 질문에 정확하지 않은 점 사과드립니다. 나는 현재 스크래치 (주로 linuxfromscratch.org 버전 7.3의 가이드를 따르는)에서 리눅스를 만들고있다. 다음과 같은 문제가 발생했습니다 : 실행 파일을 빌드 할 때 은 ELF 인터프리터라는 하드 코딩 된 경로를 가져옵니다.elf 인터프리터 (ld-linux.so.2/ld-2.17.so)를 정적 라이브러리로 빌드하는 방법은 무엇입니까?
readelf -l program
는
[Requesting program interpreter: /lib/ld-linux.so.2]
같은 내가 glibc는의 일부가이 라이브러리 LD-리눅스 so.2을 추적 보여줍니다. 이진이 매우 이식성을 잃어 버리기 때문에이 동작에 만족하지 않습니다. - 실행 파일 /lib/ld-linux.so.2의 위치를 변경하면 더 이상 작동하지 않으며 길이가 더 길고 발견 된 유일한 "수정"은 다음과 같습니다. Ncalc의 patchelf 유틸리티 을 사용하여 하드 코드 된 경로를 다른 하드 코드 된 경로로 변경하십시오. 의 경우이 이유는 ld 라이브러리의 정적 버전과 연결하고 싶지만 그러한 것은 생성되지 않습니다. 그리고 이것은 제 질문입니다. 당신은 어떻게하면 정적 버전의 ld-linux.so.2를 생성 할 수 있도록 glibc를 빌드 할 수 있었는지 설명 할 수 있었고 나중에 실행 파일에 링크 할 수있었습니다. 나는이 라이브러리가 무엇을하는지 완전히 이해하지 못한다. 그러나 은 다른 동적 라이브러리 (또는 에서 적어도 glibc.so)를로드하는 부분이라고 가정한다. 내 실행 파일을 동적으로 링크하고 싶습니다. 그러나 동적 인 링커 자체를 에 정적으로 내장하고 싶습니다. 따라서 하드 코드 된 경로에 의존하지 않을 것입니다. 또는 은 환경 변수가 LD_LIBRARY_PATH와 비슷하거나 아마도 LD_INTERPRETER_PATH 인 인터프리터 경로를 설정할 수 있기를 원합니다. 목표는 디렉토리 구조가 무엇이든 관계없이 동일한 ABI가있는 플랫폼에서 실행할 수있는 이식 가능한 바이너리를 생성 할 수있게하는 것입니다.
관련성이있는 몇 가지 배경 : Slackware 14 x86에서 i686 컴파일러 툴체인을 빌드하므로 전반적으로 모든 x86 호스트와 대상이됩니다. glibc 2.17과 gcc 4.7.x를 사용하고 있습니다.
저는 ELF 프로그램 인터프리터를 바꾸는 것이 나쁜 생각이라고 생각합니다 (Linux & binutils 전문가가 아닌 이상). 그것은 Glibc로 만들어졌습니다. 다른 것을 시도해 볼 수 있습니다 (예 : [MUSL-Libc] (http://musl-libc.org) ...). 왜 그것을 바꾸고 싶습니까? 어떤 동적 로더에 ?? 그 위치와 존재 (나쁜 생각)에 의존하기를 원하지 않는다면 동적 링크를 포기하고 정적으로 링크 된 프로그램 만 갖도록하십시오. 그리고 동적 링커'/ lib/ld-linux.so.2'는 정적으로 만들어졌지만 (여전히 공유 라이브러리이며, VDSO를 제공하는 커널을 제외한 외부 라이브러리를 사용하지 않습니다). –
동적 연결은 정적 위치에 의존하지 않고 동적이어야합니다. 이 [hardwired] 방식은 완전히 잘못되었습니다. 나는 그것을 내 시스템에서 고치고 싶다. 그리고 그 해결책은 쉽습니다. 나는 그것을 스스로 해결할 수있는 모든면에 익숙하지 않았습니다. – bobef
그런 다음 필요에 맞게 커널을 패치하십시오. 그런 다음 도구 체인 (컴파일러 및 링커)에 패치를 적용해야합니다. 사실,이 모든 것은 자유 소프트웨어이고 당신은 그것을 향상시킬 수 있습니다. –